为什么编译器在以加法运算符开头的一行不犹豫呢

Why does compiler not balk at a line beginning with an addition operator?

本文关键字:一行 不犹豫 开头 编译器 运算符 为什么      更新时间:2023-10-16

我刚刚进行了一些重构,并为自己创建了一个错误:

int i = 2;
    + 7;
    + 4;

这是简化的;在第1&2不是那么明显——至少对我来说:)。

我不明白的是编译器为什么没有捕捉到它。C++中是否有一些以加法运算符开头的有效操作?

如果没有要添加的内容,加法运算符只表示正,所以+2;只表示(+2);,这就像只有一行i;或类似的内容。它没有什么"错",但也不会发生任何事情。如果您在*nix下使用指定了-Wall的gcc进行编译,您将得到错误warning: statement has no effect,这通常很好,因为它通常是一个信号,表明您打算做的事情实际上没有做它应该做的事情。

这是一个完全有效的代码,您正在使用一元+运算符,结果是操作数的值,它还对操作数执行整数提升。

在这种情况下,图灵警告会很有帮助,例如使用-Wall -Wextra的gcc和clang会给你这样的警告:

警告:表达式结果未使用[-Wunused值]

+ 7;
^ ~

我们可以在Visual Studio中使用/Wall:获得相同的警告

警告C4555:表达式无效;具有副作用的预期表达式

这在C++标准草案5.3.1一元运算符中有介绍,其中写道:

一元+运算符的操作数应具有算术性质,不带范围枚举或指针类型,结果是论点对积分或枚举执行积分提升操作数。结果的类型是提升操作数的类型。

cppreference有以下内容:

内置的一元加号运算符返回其操作数的值。这个唯一不是no-op的情况是当操作数具有整型或无范围枚举类型,由更改整数提升,例如,它将char转换为int,或者如果操作数为受制于左值到右值、数组到指针或函数到指针转变

+ 7;是一个表达式语句,它由一个后跟分号的表达式组成。

将对表达式进行求值,并丢弃结果。通常这样做是因为表达式有副作用(例如赋值或I/O语句)。一个表达没有副作用的表达声明是合法的,但毫无用处。

如果你问得好的话,一些编译器可能会对此发出警告。

正如其他人所指出的,+是一元正算子,它与一元-算子对称存在。它产生其操作数的值(在适当的情况下执行整数提升后)。