繁体   English   中英

为什么编译器不会在以加法运算符开头的行中停止?

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

我只是做了一些重构,并为自己创建了一个错误:

int i = 2;
    + 7;
    + 4;

这是简化的; 第1行和第2行末尾的附加分号并不是那么明显 - 至少对我来说:)。

我无法弄清楚为什么编译器没有抓住它。 在C ++中是否有一些有效的操作,它开始使用加法运算符?

没有添加到添加运算符的东西只是意味着正+2; 只是意味着(+2); 这就像只有一条线i; 或类似的。 没有什么“错误”,但也没有任何事情发生。 如果你使用带有-Wall指定的gcc在* nix下编译你将得到错误warning: statement has no effect通常很好知道,因为它通常是一个标志你想要做某事的声明其实不是做什么的它应该是。

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

在这种情况下发出警告会有所帮助,例如使用-Wall -Wextra gcc和clang会给你一个这样的警告:

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

 + 7; ^ ~ 

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

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

这是覆盖在C ++草案标准节5.3.1 元运算符它说:

一元+运算符的操作数应具有算术,无范围枚举或指针类型,结果是参数的值。 对整数或枚举操作数执行整体提升。 结果的类型是提升的操作数的类型。

cppreference有以下说法:

内置的一元加运算符返回其操作数的值。 它不是无操作的唯一情况是当操作数具有整数类型或未整合的枚举类型时,它由整数提升改变,例如,它将char转换为int或者如果操作数受到左值到右值的影响,数组到指针或函数到指针的转换。

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

计算表达式,并丢弃结果。 通常这样做是因为表达式具有副作用(例如赋值或I / O语句)。 表达式没有副作用的表达式语句是合法的但没用。

如果你很好地问他们,一些编译器可能会警告它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM