int x = 15 ;
printf ( "\n%d \t %d \t %d", x != 15, x = 20, x < 30 ) ;
代码的输出是 1 20 1 但我认为它应该是 0 20 1 因为 15 == 15...
我面临“x!= 15”部分的问题
您正在为 x 分配一个新值x = 20
。
您不能对函数调用的参数列表中的这些操作假定任何特定顺序。
根据我的经验,在大多数 C/C++ 编译器下,大多数参数列表都是从右到左处理的,即使规范没有说明所需的评估顺序。
了解了有多少编译器工作后,您的参数列表将像这样评估
printf ( "\n%d \t %d \t %d", x != 15, x = 20, x < 30 ) ;
(可能)按以下顺序评估
x < 30 => 1
x = 20 (assigns x to 20, returning 20) => 20
x != 15 => 1 (because x is now 20)
如果此评估顺序适用于您的编译器,则像这样重新排列参数
printf ( "\n%d \t %d \t %d", x < 30, x = 20, x != 15 ) ;
应该屈服
1 20 0
因为比较x != 15
将在x
重新分配到 20 之前发生。
这个练习的教训是通常避免在列表结构中赋值(看起来像“a、b、c、d”的东西),或者至少不要在同一个列表结构中读取分配的变量,因为你不能保证有权从左或从左到右的评估(它取决于编译器)。
您的代码存在未指定的行为:标准并未规定执行表达式的顺序是从左到右。试试这个
int x = 15 ;
int result1 = (x != 15);
int result2 = (x = 20);
int result3 = (x < 30);
printf ( "\n%d \t %d \t %d", result1, result2, result3 ) ;