为什么编译器在以加法运算符开头的一行不犹豫呢
Why does compiler not balk at a line beginning with an addition operator?
我刚刚进行了一些重构,并为自己创建了一个错误:
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语句)。一个表达没有副作用的表达声明是合法的,但毫无用处。
如果你问得好的话,一些编译器可能会对此发出警告。
正如其他人所指出的,+
是一元正算子,它与一元-
算子对称存在。它产生其操作数的值(在适当的情况下执行整数提升后)。
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 在C++中,我如何接受不同于同一行的用户输入
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- 如何让字符数组在一行而不是多行中打印出来?
- 从 stdio 获取一行空格分隔的整数,而不知道它们是多少 (C++)
- 为什么这一行不输出我的文本文件?
- ifstream 不读取第一行
- Ofstream一直给我函数的最后一行,而不是显示所有内容
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- QT中不允许使用一行多个转换,例如qString到char*
- 为什么只有一行告诉我操作员=不可行?但是其他人很好
- 为什么"#pragma omp 关键"部分不能在同一行上具有左大括号?
- 当存在一行时,Cppcheck 不会输出警告:auto lambda = [](){};
- 阅读同一行上用双引号括起来的文本,并拒绝在不同行上关闭的双引号
- 我如何使一行代码可以选择,但在已经选择过一次后不重新选择
- 因为一行不相关的代码,速度相差那么大
- 字符串迭代器与读取每一行不兼容
- 为什么编译器在以加法运算符开头的一行不犹豫呢
- c++中,在调用函数的同一行不更新的引用变量传递
- Gnuplot:跳过最后一行/不完整的数据文件