function参数评估顺序
以下操作的结果将打印出来:
x=5; printf("%d,%d,%d\n",x,x<>2);
答案:5,20,1
我认为订单是未定义的,但我在许多网站上找到了面试问题。
从C ++标准:
参数的评估顺序未指定。 参数表达式求值的所有副作用在输入函数之前生效。 未指定后缀表达式和参数表达式列表的评估顺序。
但是,如果参数为x>>=2
且x<<=2
,则示例将仅具有未定义的行为,以便修改x。
位移操作符不会修改变量的值…因此顺序无关紧要。
评估顺序未指定,但无关紧要,因为您根本不修改x
。
所以程序定义明确,答案如下。
以下将具有未定义的语义:
printf("%d,%d,%d\n", x, x <<= 2, x >>= 2);
我在c ++标准中找到了答案。
第5.2.2.8段:
参数的评估顺序未指定。 参数表达式求值的所有副作用在输入函数之前生效。 未指定后缀表达式和参数表达式列表的评估顺序。
换句话说,它仅取决于编译器。
官方C规范中未定义评估顺序。
然而,作为实际问题,通常从右到左评估参数。
在您的问题中,位移运算符不会更改X的值,因此评估顺序并不重要。 你得到5,20,1,无论是从左到右,从右到左,还是从中到先评价。
在C中,参数以从右到左的顺序被推送到堆栈,因此第一个参数(在这种情况下,char *“%d,%d,%d”)位于堆栈的顶部。 通常(但不总是)按照推送的相同顺序评估参数。
更好地说明您所谈论的内容的问题是:
int i=1; printf("%d, %d, %d", i++, i++, i++);
官方答案是“未定义”。
实际答案(在我试过的几个编译器/平台中)是“3,2,1”。