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 = 20
为 x 赋新值。
在函数调用的参数列表中,不能假定这些操作以任何特定顺序进行。
x != 15
进行求值。 - sepp2k根据我的经验,在大多数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 ) ;
printf
的第三个参数是x = 20
,它将x
赋值为20。C语言并不保证参数的求值顺序,所以x = 20
可能会在x != 15
之前被求值。 - vcsjones