为什么C++没有power运算符?

25 c++ operator-keyword

许多语言都有电力运营商; 为什么不用C++?例如,Fortran和Python使用**并且通常使用(例如在LaTeX中)编写^.

Jam*_*nze 46

C++确实有一个幂运算符 - 它是写的pow(x, y).

最初,C的设计考虑了系统软件,并且不需要电源操作员.(但它有一些按位运算符,比如&|许多其他语言都没有.)在C++的标准化过程中有一些关于添加一个的讨论,但最终的共识或多或少是:

  • 它不可能^,因为优先级是错误的(当然,有2. ^ 8 == 256.,但2 ^ 8 == 10也不是很愉快).

  • 它不可能**,因为这会打破现有的程序(可能有一些东西x**p,有x一个 intp一个int*).

  • 可能是*^因为这个序列目前在C或C++中不合法.但这仍然需要引入额外的优先级.

  • C和C++已经有足够的特殊令牌和优先级,并且在与数字社区讨论之后,得出的结论是,确实没有任何问题 pow(x, y).

因此,C++保留了原样,这似乎没有造成任何问题.

  • pow()不是运营商.可以静态评估操作员.所以这不编译:enum {val = pow(2,10)}; (5认同)
  • "**"没有歧义.如果`b`不是指针,`a**b`在乘法的上下文中没有意义.在取幂的情况下它确实有意义.我能看到的唯一理由是C/C++/C#社区不把科学编程视为真正的编程.这是一个主要的怠慢,这是Fortran程序员将C/C++/C#视为科学编程的劣等语言的关键原因之一. (4认同)
  • @DavidHammen有很多方法可以解决歧义,沿着'vector <vector <T >>`中最后的`>>`.但它们涉及类型依赖分析,其中符号类型修改词法分析器的工作方式.如果`**`是一个合法的标记,那么最大的munch规则会将`a**b`标记为`a`,`**`,`b`,无论如何. (3认同)
  • @DavidHammen 委员会实际上与数字领域的许多专家讨论了这个问题,他们似乎并不认为拼写幂运算符“pow(x, y)”是一个问题。原因之一(也许是主要原因)`*^` 没有成功是因为我们在科学界找不到任何关心的人。 (2认同)

Sha*_*hai 9

有两个原因

  1. 该符号^保留用于按位xor 运算

  2. 您可以使用它std::pow来实现相同的功能.

关于C++的好处是你可以重载operator它来做任何你喜欢做的事情!

template< typename T >
T operator^( T x, T y ) {
    return std::pow( x, y );
}
Run Code Online (Sandbox Code Playgroud)

但是考虑到当你这样做时,其他知道C++和不认识你的人(我相信其中有很多人)可能在理解你的代码时会遇到很大的问题!

  • 是的,但为什么呢?`^`可能是电源,其他一些符号可能被选为XOR :-) (5认同)
  • @juanchopanza Fortran使用**作为力量.所以你是对的"^被采取"并不是一个不作为运营商提供权力的理由 (5认同)
  • @juanchopanza:你是否真的经常使用权力来保证运营商自己的权力? (3认同)