在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的新成员。
答案 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