2012-05-12 46 views
1

为什么下面的表达式计算为0?C中布尔表达式的结果

i > --i 

想我= 5.计算表达式从左至右,我们评估了左操作数(我),得到5,我们评价右操作数(--i),以获得4。所以有关的表达应该评估为1.但是,当我使用gcc编译并运行它时,它总是评估为0.我的思维过程中是否存在缺陷?

回答

11

这只是未定义的行为,因为您正在修改i的值以及没有插入序列点的情况下读取它。关系运算符<确实是而不是引入了一个顺序点。

从C11,6.5(2):

如果一个标量对象上的副作用是相对于相同的标量对象上或者是不同的副作用,或使用相同的值的值计算未测序标量 对象,行为是未定义的。

+0

+1。 'i'的值在*右侧*使用'i'之前执行,但没有说明'i'的值在*左侧*。 –

+2

@BinyaminSharet不,C没有在子表达式中指定evalation的顺序。你不知道是否左边(这是'i> --i'中最左边的'i'首先被评估,或者如果'>'的右边首先被评估。 – nos

+0

@nos,KerrekSB - 我得到了我的 – MByD