变量后面的加号代表什么意思?

5
以下代码的输出结果是什么?
int x,a=3;
x=+ +a+ + +a+ + +5;
printf("%d %d",x,a);

输出结果为:11 3。那么如何理解此代码呢?在这段代码中,每个“+”符号都代表正数。因此,“+ +a”表示将变量a的值转换为正数。而“+ + +a”则表示将变量a的值转换为负数。最终,x的值等于3+3+(-3)+5=8。

7
为什么写你不理解的代码? - cnicutar
8
我不确定这将如何解析,但几乎可以肯定结果是未定义的。 - juanchopanza
@juanchopanza 你是对的,它肯定是未定义的,但第一步是向 OP 解释它如何被解析为前缀或后缀递增。如果没有这个,OP 是对的,会想知道它的含义,并且无法知道它是未定义的。 - Pascal Cuoq
4
这段代码中没有后置或前置自增。 - cnicutar
1
@vard 请查看此问题:https://dev59.com/tXRC5IYBdhLWcg3wOeWB - HostileFork says dont trust SE
显示剩余10条评论
5个回答

19

我认为DrYap是正确的。

x = + + a + + + a + + + 5; 

与下面的代码等价:

x = + (+ a) + (+ (+ a)) + (+ (+ 5));

关键点如下:

1)在C和C++中,没有将+作为后缀运算符的情况,因此我们知道必须将其解释为前缀。

2)一元+比二元+具有更高的优先级。

有趣不是吗?如果这些是减号,它看起来就不那么奇怪了。一元正负只是一个前导符号,或者换句话说,“+x”与“0+x”相同。


是的,那很有道理。如果在 + 号之间去掉空格,就会显示编译错误:“需要 Lvalue”。 - user980089
3
是的,因为如果你移除 + + 之间的空格,就会得到一个单独的 ++(递增运算符),而不是两个加号。 - Mr Lister
1
“+x” 应该像 “0+x” 一样,对于任何类型的 “x”,都是存在“0”的,但在重载下没有这样的保证。它也被称为“衰减运算符”,因为它会返回一个纯值,即使其操作数是一个左值。例如,“++ + a” 是非法的,除非进行过载,并且通常不会增加 “a”。 - Potatoswatter
好的观点。重载点仅适用于C ++。 “纯值”点对C和C ++应该是正确的。请随意编辑答案。 - Julian

13

在一个加号后面,它只被视为下一个值之前的加号。如果您使用一致的空格,则与以下代码相同:

x = + + a + + + a + + + 5;

但并非所有的 + 都是必需的,所以它的作用与执行以下操作相同:

x = a + a + 5;

变量a的值没有改变,因为您从未使用过递增运算符++,它由两个+符号组成且之间没有空格。+和++是两个不同的运算符。


4
我需要补充一点的是,C语言有一个一元运算符+,与一元运算符-对称,而这就是此处使用的内容。除了让程序员感到困惑之外,没有人知道一元正号的作用是什么。http://msdn.microsoft.com/zh-cn/library/s50et82s(v=vs.71).aspx - Pascal Cuoq
但在这种情况下,a的值没有增加。第二个a前面有3个加号。 - user980089
你的意思是什么,它不发生了吗? - DrYap
1
@user980089:"is not incremented" 你知道“+5”的意思是“5”,对吧?所以“+a”的意思是“a”。"+ + a"和"++a"不是一回事。 - SigTerm
1
@PascalCuoq 它至少有一个用途;请参见我在朱利安的答案上方的评论。 - Potatoswatter

3
代码似乎等同于:
x = (+(+(a))) + (+ (+(a))) + (+(+(5)));
也就是 x = a + a + 5。你知道在数字之前可以加上+或-号吗?现在这些+仅表示变量的符号。由于符号是+,因此变量保持不变。例如+5表示"5",+a表示"a",+ +a表示"+(+a)",表示"a"。以同样的方式,您可以编写x = + + + 3 + + + + 3 + + + + 5。或者x = - + + - 3 + - + - 3 - - + 5;。

3
由于+运算符从未相邻,而总是由空格分隔开来,因此语句x=+ +a+ + +a+ + +5;实际上被解读为x=+ (nothing)+a+(nothing) +(nothing) +a+(nothing) +(nothing) +5;,因此最终的方程式变成了x=a+a+5;,因此得出结果。请注意,保留了HTML标签。

0

x=+ +a+ + +a+ + +5 : ињЩзЫЄељУдЇО

x = x=+ +a+ + +a+ + +5 жИЦиАЕ жИСдїђеПѓдї•е∞ЖеЕґеЖЩжИР x = + (+ a) + (+ (+ a)) + (+ (+ 5)) еК†еПЈеП™жШѓи°®з§Їзђ¶еПЈпЉМжЬАзїИиЃ°зЃЧзїУжЮЬдЄЇ x = a + a + 5гАВ


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接