int x = 15 ;
printf ("\n%d \t %d \t %d", x != 15, x = 20, x < 30) ;
代码的输出是1 20 1,但我认为它应该是0 20 1自15 == 15 ...!= C语言符号查询
我面临同一个问题“x!= 15”部分
int x = 15 ;
printf ("\n%d \t %d \t %d", x != 15, x = 20, x < 30) ;
代码的输出是1 20 1,但我认为它应该是0 20 1自15 == 15 ...!= C语言符号查询
我面临同一个问题“x!= 15”部分
根据我的经验,大多数参数列表在大多数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
被重新分配到20
这个练习的教训是要尽量避免使用列表构造分配(东西看起来像“A,B将出现比较x != 15
,c,d“)或至少不能读取同一个列表结构中的赋值变量,因为不能保证从右到左或从左到右的评估(与编译器相关)。
说句不明白,行为是* undefined *,结果*会因编译器而异。 –
@JohnBode我以为我明确表达了这一点,但大多数使用LR类型解析器实现的编译器会导致从右到左列表处理的高效(因此是选择的)权利。如果不清楚评估顺序不能保证,那么谢谢你让它更加明显。 –
您的代码遭受未指定的行为:执行表达式的顺序不是由标准强制执行的,从左到右。 试试这个代替
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) ;
它应该是x == 20而不是x = 20。这导致你的x变量从15变化,实际上使这个答案有意义。 –
你对'printf'的第三个参数是'x = 20',它将'x'赋值为20.C不能保证参数被评估的顺序,所以'x = 20'可以在'x!= 15'。 – vcsjones