为什么这个算术表达式产生这个结果?

时间:2011-10-16 00:06:18

标签: c

有人可以向我解释这个简单代码段的输出吗?

int i=7;
int j=3*i-- + 2;
printf("%d %d",i,j)

当我编译时,我得到6,23

23岁怎么样?我以为它会是3 * 7 = 21减少到20而增加2是22而不是23?

4 个答案:

答案 0 :(得分:3)

int i = 7; /* i is 7 */
int j = (3 * (i--)) /* means 3 * 7 */ + 2; /* 3 * 7 + 2 = 23 */
/* i is now 6, because it was decreased by the postfix -- operator */
printf("%d %d", i /* 6 */, j /* 23 */);

答案 1 :(得分:2)

i--确实会产生将i递减1(将其设置为6)的副作用,但该表达式会产生之前的i--i会减少i并产生新的结果。

答案 2 :(得分:1)

--绑定到i,而不是3*i。 (由于(3*i)--不是3*i所要求的左值,因此您无法--。)i--的值是i的原始值在减少之前。

答案 3 :(得分:1)

C中的一元运算符列表:http://en.wikipedia.org/wiki/Unary_operation#C_family_of_languages

--是一元运算符并绑定到i,因此它是i--,而不是(3 * i)--

由于它是递减后的,因此使用了i BEFORE递减的值,所以你的等式只是:

3 * 7 + 2i将为6。