如何在C中确定i +++ - j

时间:2013-12-08 17:33:17

标签: c

在C中,

int i = 20;
int j = 5;
int k = i+++--j;

为什么k = 24?

根据我的理解,k =(i)++ +( - j)所以它是(20 + 4)++ = 25.

行。这是我为测试编写的一个小程序,是的,在分配k后完成后增量。

#include <stdio.h>
int main()
{
    int i = 20;
    int k = i++;
    printf("%d\n", k);
    printf("%d\n", i);
    return 0;
}

输出:

20
21

有人能告诉我为什么要投票?我对此不确定,因为我是C的新成员。

5 个答案:

答案 0 :(得分:5)

C有一个着名的最大咀嚼策略规则。 根据这条规则:

i+++--j

被解析为

(i++) + (--j) 
  

(C99,6.4p4)&#34;如果输入流已被解析为预处理令牌直到给定字符,则下一个预处理令牌是可构成预处理令牌的最长字符序列。&#34;

当然,i++的值为i--j的值为j - 1,因此i+++--j的值为20 + 4 }等于24

答案 1 :(得分:2)

  

据我所知,k = (i)++ + (--j)

是的,就是这样。

  

所以它是(20 + 4)++ = 25.

不,它是20 + 4,所以它是24.(你不能增加一个常数,也没有任何意义,表达式中也没有第二个增量运算符,所以我真的不知道你有什么想法)。但否则你的扣除是正确的。

答案 2 :(得分:2)

将其视为贪婪算法,如果它们有意义,它将占用尽可能多的字符。

示例:

i+   // good, keep going
i++  // good, keep going
i+++ // not good, start new token
+    // good, keep going
+-   // not valid, start new token
-    // good
--   // good
--j  // valid

所以:

int i = 20;
int j = 5;
int k = i++ + --j; // (20++) + (--5)

这是如何分组的。第二部分是前后增量。

i++ // post-increment, use the value first and then increment
--j // pre-increment, decrement first and then use the value

所以你得到:

int k = 20 + 4
// afterwards: i = 21 and j = 4

答案 3 :(得分:0)

我同意其他人在解析方面所说的话。顺便说一句,当遇到诸如此类运算符优先级之类的问题时,可能非常重要。对于C,this site有一个运算符列表及其优先级。

答案 4 :(得分:0)

k的值由运算符优先级确定。

n = i++n = ++i之间的差异在于,在{1}}的值中,i的值在递增之前被赋值给n,但在最后一个值{{1在增量后分配给n。

i的情况下。操作按以下顺序处理:

k = i++ + --j