int x = 15 ;
printf ( "\n%d \t %d \t %d", x != 15, x = 20, x < 30 ) ;
代码的输出是1 20 1,但我认为它应该是0 20 1,因为15 == 15 ...
我遇到了&#34; x!= 15&#34;部分
答案 0 :(得分:7)
您正使用x = 20
为x分配新值。
您不能在函数调用的参数列表中假设这些操作的任何特定顺序。
答案 1 :(得分:5)
根据我的经验,大多数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”的东西)或至少不读取同一列表中的赋值变量构造,因为你无法确定从右到左或从左到右的评估(它依赖于编译器)。
答案 2 :(得分:0)
您的代码遭受未指定的行为:标准不强制执行表达式的顺序是从左到右。 试试这个
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 ) ;