Decrementation / Incrementation是一项基本操作,但它对- --
和+ ++
的优先权让我感到困惑。我将使用减量来说明:
我在a
和b
之间有一套不同的操作方式:See it working here
#include <iostream>
using namespace std;
int a=10, b=7;
int main() {
// - and -- opearator // Results: Details:
a = 10, b = 7; cout << a---b << endl; // 3 a post-decrement
a = 10, b = 7; cout << a ---b << endl; // 3 a post-decrement
a = 10, b = 7; cout << a- --b << endl; // 4 b pre-decrement
a = 10, b = 7; cout << a-- -b << endl; // 3 a post-decrement
a = 10, b = 7; cout << a--- b << endl; // 3 a post-decrement
return 0;
}
我理解4
输出来自递减的b
,7
转为6
,并从a
减去10
1}}。
另外,由于其他四个陈述,我认为编译器将它们全部视为---
但是,这里出现了- --
结果的混淆。 See it working here
答案 0 :(得分:10)
解析遵循最大咀嚼规则,因此所有语句减去第三个都被解释为(a--)-b
,递减a
并返回其先前的值({{1} })。
第三个是10
,它是a-(--b)
的预递减,因此返回新的递减值。
答案 1 :(得分:2)
但是为什么它在声明之后没有减少呢?
因为--X
运算符:
所以,--b
之后无法“递减”。它始终是“之前”。
混乱
仔细查看代码和结果:每次写---
时没有空格,结果都是一样的:三。三也是-- -
案例的结果。即使有一个纯粹的猜测,你可以说编译器将其解析为-- -
。事实上,它实际上就是这样,因为C ++标准要求它这样做。查看有关“最大咀嚼”规则的评论。其他多字符运算符也是如此,例如++
。
在你将其拆分为- --
的另一种情况下,编译器没有其他选择:由于中间的空间,它必须将其视为- --
。就像-- -
一样,这种情况很明显,并且完全可见哪个部分构成了--
运算符,编译器必须遵守它。
答案 2 :(得分:2)
我认为这是因为Maximal Munch Rule。来自维基:
在计算机编程和计算机科学中,“最大的蒙克”或 “最长匹配”是在创建一些构造时的原则,如 应该消耗尽可能多的可用输入。
ANSI标准规定了一种后来被称为的约定 最大咀嚼策略。最大的蒙克说,如果还有更多 对于下一个标记的一种可能性,编译器将更喜欢 咬掉涉及最长字符序列的那个。
答案 3 :(得分:1)
该陈述相当于10-6 = 4, 休息等于9-7 = 3.
#include <iostream>
using namespace std;
int a=10, b=7;
int main() {
// - and -- opearator // Results: Details after a statement:
cout << (a--)-b << endl; a=10, b=7; // 3 Both a and b decremented
cout << (a --)-b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a- (--b) << endl; a=10, b=7; // 4 Neither a or b decremented
cout << (a--) -b << endl; a=10, b=7; // 3 Both a and b decremented
cout << (a--)- b << endl; a=10, b=7; // 3 Both a and b decremented
return 0;
}
答案 4 :(得分:1)
在这一系列陈述中
cout << a---b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a ---b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a- --b << endl; a=10, b=7; // 4 Neither a or b decremented
cout << a-- -b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a--- b << endl; a=10, b=7; // 3 Both a and b decremented
你忘了再说一句:)
cout << a --- b << endl; a=10, b=7; // 3 Both a and b decremented
在所有这些陈述中
cout << a---b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a ---b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a--- b << endl; a=10, b=7; // 3 Both a and b decremented
cout << a --- b << endl; a=10, b=7; // 3 Both a and b decremented
编译器将输出的表达式解析为
a-- -b
即尝试提取最长的有效令牌。
postdecrement运算符的值,例如a--
,是递减前的操作数的值。所以在表达中
a-- -b
a--
的值为10,b
的值为7
。差异等于3
。
你有唯一的表达式与预先生成运算符
cout << a- --b << endl; a=10, b=7; // 4 Neither a or b decremented
--b
的值是递减b
后6
的值。因此,您10 - 6
等于4
。
如果你在所有这些陈述中用负号替换加号,你将获得相同的效果
17
17
18
17
17
17 // this corresponds to my added statement a +++ b
所以这些操作 - 和+ ++的行为方式相同。