操作c = a +++ b是什么意思?

use*_*985 31 c c++ visual-c++

以下代码让我感到困惑

int a=2,b=5,c;
c=a+++b;
printf("%d,%d,%d",a,b,c);
Run Code Online (Sandbox Code Playgroud)

我预计输出为3,5,8,主要是因为a ++意味着2 + 1等于3,而3 + 5等于8,所以我预期3,5,8.事实证明结果是3,5,7.有人可以解释为什么会这样吗?

Fre*_*Foo 91

它被解析为c = a++ + b,并且a++意味着后增量,即在获取a计算值之后递增a + b == 2 + 5.

永远不要写这样的代码.

  • 原因是C和C++的词法分析器试图匹配他们看到的东西时能够找到的最大字符串.这就是你没有看到`var`为三个标记`v`,`a`和`r`的原因.或者为什么你看``=`作为一个标记而不是`>`和`=`.也是你在`vector <vector <int >>中看到一个`>>`令牌导致解析错误的原因相同.因此,当词法分析器看到第一个加号时,它会尝试下一个字符,它会看到它可以将两个字符都匹配为"++",然后继续查看下一个"+".因此,解析器看到`a ++ + b` (39认同)
  • 你的标记化是"a ++ + b"的观点是正确的,但你声称在计算*a + b之后增量发生是错误的.C和C++语言没有指定*在什么时候*相对于加法计算增量.将其计算为"temp = a ++",然后计算"temp + b",计算增量后加"a + b"将是完全合法的.请记住,表达式的*值*和观察它们具有这些值*的时刻序列是非常不同的分析. (10认同)
  • @Blagovest Buyukliev:对于C,规则是6.4第4段:"如果输入流已被解析为预处理标记直到给定字符,则下一个预处理标记是可构成预处理标记的最长字符序列...... " (7认同)
  • 哪个规则表明它被解析为`a ++ + b`,而不是`a + + + b'?令牌化器贪婪吗? (2认同)

Naw*_*waz 40

Maximal Munch Rule适用于这样的表达式,根据该表达式,表达式被解析为:

c = a++ + b;
Run Code Online (Sandbox Code Playgroud)

也就是说,a后递增(a++),因此当前的值a(在后递增之前)用于+操作b.

  • 知道这一点的+1称为"最大的蒙克!" (10认同)

Dav*_*vid 6

a ++是递增的,即表达式取a的值然后加 1.c
= ++ a + b会做你期望的.