!= C语言中的符号查询

YRT*_*T92 3 c operators

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"部分的问题

pb2*_*b2q 7

您正在为x分配新值x = 20.

您不能在函数调用的参数列表中假设这些操作的任何特定顺序.


Edw*_*uck 5

根据我的经验,大多数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"的东西)或至少不读取同一列表构造中的赋值变量,因为您无法确定从左到右评估(依赖于编译器).