!= C语言中的符号查询

时间:2012-06-07 20:34:59

标签: c operators

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;部分

3 个答案:

答案 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 ) ;