为什么C和C ++允许表达式(int)+ 4 * 5?


86
(int) + 4*5;

为什么这样做(添加带有值的类型)是可能的?(尝试使用g ++和gcc。)

我知道这没有意义(也没有影响),但是我想知道为什么这是可能的。



45
有一个有用的工具cppinsights,可以帮助您从编译器前端的角度了解代码的外观。它也有一个在线版本,您可以看到它讲述了您的示例(与您得到的答案相同的“括号”)
Nikita Kniazev

22
该声明等同于+(int)+ 4*5;and -(int)- 4*5;-+-+-(int)-+-+- 4*5;并且在诗意上更少;
chqrlie 19'4-22

16
哪一部分让您感到困惑?就我所知,您在问为什么允许您写5而没有指示符号。
卡斯滕S

5
C ++不应该警告您在C ++中不推荐使用C类型的强制转换吗?
李斯特先生,

Answers:


141

+这里是一元的+运营商,而不是二进制加法运算。这里没有其他事件发生。

另外,语法(int)用于类型转换。

您可以将该语句重新阅读为

(int) (+ 4) * 5;    

解析为

((int) (+ 4)) * (5);    

里面说

  1. 将一元运算+符应用于整数常量值4
  2. 类型转换到 int
  3. 与操作数相乘 5

这类似于(int) (- 4) * (5);,其中对一元运算符的用法更为熟悉。

在您的情况下,一元+和强制转换int-都是多余的。


50
“铸造”,而不是“类型转换”。类型转换是演员发生的事情。
基思·汤普森

8
(+ 4)不是使操作数+4,而是将一元+应用于操作数4,在OP的情况下确实是无操作的,但是在其他情况下可能导致整数提升或数组衰减。例如char c = 0; sizeof +c == sizeof c可能是假的,sizeof +"a"可能不是2
chqrlie

7
“两者都是多余的”-整个事情都是多余的,就像42;:-)
paxdiablo

11
使用术语类型转换,我没有发现任何问题。看来我不是唯一的一个

14
@Ben Typecasting不是强制类型转换。
肯尼斯·K

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.