Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么后缀运算符++;优先级高于前缀运算符++;?_C++_Increment_Operator Precedence_Prefix Operator_Postfix Operator - Fatal编程技术网

C++ 为什么后缀运算符++;优先级高于前缀运算符++;?

C++ 为什么后缀运算符++;优先级高于前缀运算符++;?,c++,increment,operator-precedence,prefix-operator,postfix-operator,C++,Increment,Operator Precedence,Prefix Operator,Postfix Operator,这样定义,我们既不能做++x++也不能做++x--。但另一方面,(++x)+++和(++x)--都是有用的表达式:(++x)+将x增加两倍并返回“中间”的值,(++x)--基本上等同于x+1,但完全避免了调用操作符+,这有时非常有用 那么,为什么没有将优先级定义为使++x++自动扩展为(++x)+,而不是++(x++)?对于后者是否有一些我不理解的隐藏意义,或者只是为了将优先级保持在一个简单的列表中,所有前缀运算符组成一个级别 EDIT好的,我没有明确地说,但是:当然,我的意思是x是用户定义的类

这样定义,我们既不能做
++x++
也不能做
++x--
。但另一方面,
(++x)+++
(++x)--
都是有用的表达式:
(++x)+
x
增加两倍并返回“中间”的值,
(++x)--
基本上等同于
x+1
,但完全避免了调用
操作符+
,这有时非常有用

那么,为什么没有将优先级定义为使
++x++
自动扩展为
(++x)+
,而不是
++(x++)
?对于后者是否有一些我不理解的隐藏意义,或者只是为了将优先级保持在一个简单的列表中,所有前缀运算符组成一个级别

EDIT好的,我没有明确地说,但是:当然,我的意思是
x
是用户定义的类型。对于内置类型,
(x+=2)-1
当然比
(++x)+
好,而
x+1
(++x)--
好得多。我想到的情况是一个相当复杂类型的半关联容器的迭代器,其中操作符
+=
+
(设计用于随机访问)必须重建缓存才能有效地处理一般请求,因此比
+
慢一个数量级。当然,我可以修改它们,让它们总是先检查参数是否是一个非常小的整数,在这种情况下,只需反复调用
操作符+++
,而不是执行随机访问过程。这在这里应该可以很好地工作,尽管我可以想象在某个时候我可能会遇到这样的情况,我希望
操作符+=
总是以随机访问的方式进行,不管我呈现的数字有多小


所以对我来说,我的结论是:

具有一个简单且易于记忆的优先级列表(其中所有后缀运算符位于任何前缀运算符之前)的优点足以容忍一个小缺点,即始终必须使用括号来组合前缀运算符和后缀运算符
++
/
--
,因为这种组合很少使用

简单的“C是这样做的”,虽然这似乎是真正的原因,但对我来说却不太令人满意,因为在C中根本不允许使用
++x++
,因此可以在不损坏任何现有代码的情况下重新定义这个组合

无论如何,我将继续使用
(++x)--
,因为括号真的没有那么大的伤害。

这两个
(++x)+
(++x)--
调用[假设x是一个基本类型]。对于用户定义的,请键入场景。但是,通常不建议在代码中使用这种令人困惑的表达式

就先行性而言,它解释了为何增量后的优先级高于增量前的优先级

(++x)+
x
增加2,并返回“中间”的值

为什么不
(x++=2)-1
(++x,x++)
?两者似乎都更清楚。对于标量,这两个都是在C++03中定义良好的,与您建议的表达式相反


(++x)
本质上等同于
x+1
,但完全避免了调用
操作符+
,这有时非常有用

那是没有任何解释的武断陈述。所以我要扔进游泳池:

x+1
本质上等同于
(++x)--
,但完全避免了调用
运算符+++
运算符--
,这有时很有用


那么,为什么没有定义优先级,让++x++自动扩展到(++x)++而不是++(x++)


只是为了让这些神秘的角落案例不出错?不可能。你能给我背诵一下话务员吗?如果您不能这样做,最好不要尝试在代码中编写
++x++

C++标准只是保留了C规则,很明显,考虑到运算符重载和尚未发明的语言中尚未发明的习惯用法,这些规则并没有固定下来


查看中的可用内容,可以看到此优先级已经存在于B中(一元运算符从右向左绑定。因此,
-!x++
在用户对B的引用中绑定为
-(!(x++)
),而我在BCPL中没有看到增量运算符。

因为问题中没有指定
x
的类型,这两个都不一定会产生未定义的行为。顺便说一句,我从你发布的链接中阅读了Eric的帖子,但没有任何解释。该链接中的问题也被标记为
C.
。C是不一样的C++。我不理解埃里克的帖子在这里的关联性。纳瓦兹:他的理由从C++的观点看来也是恰当的。纳瓦兹:那么标准化委员会是怎么想的?诚实的回答是:我不知道。即使这些例子不是UB,也不会有什么实用性,因为它有很大的混淆范围。spec对这些运算符是如何分组的有什么要说的吗?如果是这样,我猜这只是使语法更容易编写。顺便说一句,每个后缀运算符的优先级都高于每个前缀运算符。我发现这个统一的语法规则在破译复杂的C声明程序时非常有用。