C++ C和C+中的几个一元运算符+;

C++ C和C+中的几个一元运算符+;,c++,c,C++,C,使用这样的表达符合标准吗 int i = 1; +-+-+i; 如何确定i变量的符号?i不会被修改(C:不插入序列点| C++:以非顺序方式),因此它是合法的。您只需为每个操作员创建一个新的临时值 一元数+甚至不起任何作用,所以你只需要两个否定,就可以得到表达式的1。变量i本身永远不会更改。i不会被修改(C:不插入序列点| C++:以非顺序方式),因此它是合法的。您只需为每个操作员创建一个新的临时值 一元数+甚至不起任何作用,所以你只需要两个否定,就可以得到表达式的1。变量i本身从未更改。是的

使用这样的表达符合标准吗

int i = 1;
+-+-+i;

如何确定i变量的符号?

i
不会被修改(C:不插入序列点| C++:以非顺序方式),因此它是合法的。您只需为每个操作员创建一个新的临时值


一元数
+
甚至不起任何作用,所以你只需要两个否定,就可以得到表达式的
1
。变量
i
本身永远不会更改。

i
不会被修改(C:不插入序列点| C++:以非顺序方式),因此它是合法的。您只需为每个操作员创建一个新的临时值


一元数
+
甚至不起任何作用,所以你只需要两个否定,就可以得到表达式的
1
。变量
i
本身从未更改。

是的。一元
+
-
从右向左关联,因此表达式解析为

+(-(+(-(+i))));
这将导致
1


请注意,这些可以重载,因此对于用户定义的类型,答案可能不同。

是的。一元
+
-
从右向左关联,因此表达式解析为

+(-(+(-(+i))));
这将导致
1



请注意,这些值可能会被重载,因此对于用户定义的类型,答案可能会有所不同。

您的运算符没有副作用,
+i
对int本身不做任何操作,并且您不使用临时生成的值,而是删除不做任何操作的
+
,并且您的
-(-i)
开关等于
i
本身。(在代码中删除
+
将转换运算符,我的意思是在计算中删除它,因为它没有效果)

您的运算符没有副作用,
+I
对int本身不做任何处理,您不使用临时生成的值,而是删除不做任何事情的
+
,您有
-(-I)
开关等于
i
本身。(在代码中删除
+
将转换运算符,我的意思是在计算中删除它,因为它没有效果)

为什么你不自己检查?@ LeeNeverGup,你的意思是检查?编译器甚至可以优化这条线:<代码> +++-i;< /Cord> @ LeeNeverGup:因为C++有一个坏习惯提醒我们,仅仅因为你不能表示它是合法的。然而,在这种情况下,是的。这个符号将被确定你所期望的方式。就ard而言,是的,它符合标准。对于编码标准,答案应该是“该死的,不!”你为什么不自己检查?@ LeeNeverGup,你检查的意思是什么?编译器甚至可以优化这条线:<代码> +++-i;< /Cord> @ LeeNeverGup:因为C++有一个坏习惯提醒我们,仅仅因为你不能表示它是合法的。然而,在这种情况下,是的。这个符号将被确定你所期望的方式。是的,它符合标准。对于编码标准,答案应该是“该死的,不!”。结果表明,它们被解析的顺序无关紧要,因为一元否定和正化对于整数类型是关联的。@Wug在这种情况下,不会。它甚至可能被完全优化。如果它们保持关联,会是
((+-)+)-)+)我
?那是胡说八道;我不会称它们为右联想,或以任何方式联想。@anatolyg如果世界是平的呢?不管你喜欢与否,它们都是右联想的。左/右联想性是一个可以分配给二元运算符的属性。它对一元运算符毫无意义。结果表明,它们的解析顺序无关紧要因为一元否定和正化对于整数类型是关联的。@Wug在本例中,不是。它甚至可能被完全选择。如果它们是关联的,会是
(+-)+)-+)我
?那是胡说八道;我不会称它们为右联想,或以任何方式联想。@anatolyg如果世界是平的呢?不管你喜欢与否,它们都是右联想的。左/右联想性是一个可以分配给二元运算符的属性。它对一元运算符没有任何意义。如果你删除
+
,你就只剩下一个
--i
,这是一个完全不同的故事。@LuchianGrigore请再读一遍我的回答我在回答的末尾已经提到了这个问题。你的意思是“在代码中删除+将转换运算符,我的意思是在计算中删除它,因为它没有效果”?是的……我不明白,但如果这是你的意思,那么好吧……如果你删除
+
,你就剩下
--I
,这是一个完全不同的故事。@LuchianGrigore请再读一遍我的回答我在我的回答末尾已经提到了这个问题你的意思“在代码中删除+将转换运算符,我的意思是在计算中删除它,因为它没有效果”?是的…我不明白,但如果这是你的意思,那么好吧。。。