C 我不知道';我不知道强化前后的情况

C 我不知道';我不知道强化前后的情况,c,increment,operator-keyword,post-increment,C,Increment,Operator Keyword,Post Increment,为什么结果是12而不是13 所以我认为第一个k/j被计算,得到0 然后j-0变成7 那么5+7=12 然后12++在计算任何东西的末尾 所以答案应该是13,但它是12 如果有人能解释一下,我将不胜感激 int i = 5,j = 7,k = 3; int result = i+++j-k/j; printf("%d",result); 评估顺序: 1) k/j = 0 3) i++ + j 5++ + 7 = 12 3) (i+++j)-k/j 12-0 = 12

为什么结果是12而不是13 所以我认为第一个k/j被计算,得到0 然后j-0变成7 那么5+7=12 然后12++在计算任何东西的末尾 所以答案应该是13,但它是12 如果有人能解释一下,我将不胜感激

int i = 5,j = 7,k = 3;
    int result = i+++j-k/j;
    printf("%d",result);
评估顺序

1) k/j = 0
3) i++ + j
   5++ + 7 = 12
3) (i+++j)-k/j
    12-0 = 12
现在i将增加到6

所以答案是12而不是13

要得到13,试试这个

++i+j-k/j;
评估顺序

1) k/j = 0
3) i++ + j
   5++ + 7 = 12
3) (i+++j)-k/j
    12-0 = 12
现在i将增加到6

所以答案是12而不是13

要得到13,试试这个

++i+j-k/j;

你已经被运算符优先级和整数除法咬到了。下面这个表达式中的所有内容,间隔开以便可读,都是使用整数数学完成的

int result = i++ + j - k / j;

由于计算后,
i++
增加了
i
,因此计算时,
i
为5,之后为6

除法的优先级高于加法或减法,所以它实际上是这样的:

int result = 5 + 7 - (3 / 7);
所有整数数学的小数部分都被截断,因此
3/7
为0

int result = 5 + 7 - 0;
这是你的12


这就是为什么最好避免在较大的表达式中依赖于递增运算符的前置或后置性质,它们使表达式难以理解并且容易出错。要么单独使用它们作为
i+=1
的简写,就像在
中使用(inti=0;i
一样,要么编写
i+=1

你已经被运算符优先级和整数除法咬到了。下面这个表达式中的所有内容,间隔开以便可读,都是使用整数数学完成的

int result = i++ + j - k / j;

由于计算后,
i++
增加了
i
,因此计算时,
i
为5,之后为6

除法的优先级高于加法或减法,所以它实际上是这样的:

int result = 5 + 7 - (3 / 7);
所有整数数学的小数部分都被截断,因此
3/7
为0

int result = 5 + 7 - 0;
这是你的12

这就是为什么最好避免在较大的表达式中依赖于递增运算符的前置或后置性质,它们使表达式难以理解并且容易出错。或者单独使用它们作为
i+=1
的简写,如
中的(inti=0;i
,或者编写
i+=1

int result = (i + j) - (k / j); i = i + 1;
与实际完成的操作相匹配

这个

int result = (i + j) - (k / j); i = i + 1;

与实际完成的操作相匹配

答案是5加7,因为你是后增量
i
12++
没有意义,因为
12
不是一个变量。“我不知道前增量和后增量”-所以了解一下它们吧答案是5加7,因为你是后增量
i
12++
没有意义,因为
12
不是一个变量。“我不知道前增量和后增量”-所以了解一下它们吧优先级相等的操作通常是从左到右进行的(此规则有几个例外)。您的“求值顺序”是一个可能的顺序,但不能保证,例如,
i+j
可能在
k/j
@JohnHascall之前求值。我认为您将关联性与求值顺序混淆了
f()-g()-h()
是左关联的,但函数可以在任何情况下调用order@M.M我认为/比+优先级更高,所以k/j应该首先评估。然后从左到右。我更改了我的解决方案。@Avi您将优先级与求值顺序混为一谈同等优先级的操作通常从左到右进行(此规则有几个例外)。您的“求值顺序”是一个可能的顺序,但不能保证,例如,
i+j
可能在
k/j
@JohnHascall之前被计算,我认为你把联想性和计算顺序弄混了
f()-g()-h()
是左关联的,但函数可以在任何情况下调用order@M.M我认为/比+优先级更高,所以k/j应该首先评估。然后从左到右。我更改了我的解决方案。@Avi你把优先级和求值顺序弄混了,所以从来没有应用过+?@noobPoopDeck它被应用过,但它被应用到
I
I
之后。打印
i
,你会看到它是6。所以++从来没有被应用过?@nooboopdack它被应用过,但它被应用到
i
,然后使用
i
。打印
i
,您将看到它是6。