int x = 15 ;
printf ( "\n%d \t %d \t %d", x != 15, x = 20, x < 30 ) ;
Run Code Online (Sandbox Code Playgroud)
代码的输出是1 20 1,但我认为它应该是0 20 1,因为15 == 15 ...
我遇到了"x!= 15"部分的问题
根据我的经验,大多数C/C++编译器都会从右到左处理大多数参数列表,即使规范没有说明所需的评估顺序.
通过对多少编译器工作的理解,您的参数列表将被评估
printf ( "\n%d \t %d \t %d", x != 15, x = 20, x < 30 ) ;
Run Code Online (Sandbox Code Playgroud)
按顺序评估(可能)
x < 30 => 1
x = 20 (assigns x to 20, returning 20) => 20
x != 15 => 1 (because x is now 20)
Run Code Online (Sandbox Code Playgroud)
如果此编译顺序适用于您的编译器,则重新排列参数,如此
printf ( "\n%d \t %d \t %d", x < 30, x = 20, x != 15 ) ;
Run Code Online (Sandbox Code Playgroud)
应该是
1 20 0
Run Code Online (Sandbox Code Playgroud)
因为比较x != 15将在x重新分配到20 之前发生.
本练习的教训是通常避免列表构造中的赋值(看起来像"a,b,c,d"的东西)或至少不读取同一列表构造中的赋值变量,因为您无法确定从左到右评估(依赖于编译器).