2012-06-07 121 views
3
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”部分

+1

它应该是x == 20而不是x = 20。这导致你的x变量从15变化,实际上使这个答案有意义。 –

+1

你对'printf'的第三个参数是'x = 20',它将'x'赋值为20.C不能保证参数被评估的顺序,所以'x = 20'可以在'x!= 15'。 – vcsjones

回答

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被重新分配到20

这个练习的教训是要尽量避免使用列表构造分配(东西看起来像“A,B将出现比较x != 15 ,c,d“)或至少不能读取同一个列表结构中的赋值变量,因为不能保证从右到左或从左到右的评估(与编译器相关)。

+0

说句不明白,行为是* undefined *,结果*会因编译器而异。 –

+0

@JohnBode我以为我明确表达了这一点,但大多数使用LR类型解析器实现的编译器会导致从右到左列表处理的高效(因此是选择的)权利。如果不清楚评估顺序不能保证,那么谢谢你让它更加明显。 –

7

您正在为x分配一个新值,x = 20

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

+0

我不认为他打算这么做。他看起来并不像他对输出中的20人感到惊讶。我认为他只是感到惊讶,在分配后评估了'x!= 15'。 – sepp2k

+0

@ sepp2k所以,我更仔细地阅读了问题和期望的输出,并编辑了我的答案。谢谢。 – pb2q

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