function参数评估顺序

以下操作的结果将打印出来:

x=5; printf("%d,%d,%d\n",x,x<>2); 

答案:5,20,1

我认为订单是未定义的,但我在许多网站上找到了面试问题。

从C ++标准:

参数的评估顺序未指定。 参数表达式求值的所有副作用在输入函数之前生效。 未指定后缀表达式和参数表达式列表的评估顺序。

但是,如果参数为x>>=2x<<=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”。