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

Ern*_*dar 83 c c++ casting language-lawyer

(int) + 4*5;
Run Code Online (Sandbox Code Playgroud)

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

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

Sou*_*osh 137

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

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

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

(int) (+ 4) * 5;    
Run Code Online (Sandbox Code Playgroud)

解析为

((int) (+ 4)) * (5);    
Run Code Online (Sandbox Code Playgroud)

其中说,

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

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

对于您而言,一元+和强制转换int-都是多余的。

  • “铸造”,而不是“类型转换”。类型转换是演员发生的事情。 (50认同)
  • @Ben Typecasting不是强制类型转换。 (14认同)
  • 使用术语类型转换,我没有发现任何问题。似乎[我不是唯一的](http://www.cplusplus.com/doc/oldtutorial/typecasting/)。 (11认同)
  • `(+ 4)`不是*使操作数+4 *,这意味着将一元`+`应用于操作数4,这在OP的情况下确实是空操作,但可能导致整数提升或在其他情况下数组衰减。例如`char c = 0; sizeof + c == sizeof c`可能是错误的,而`sizeof +“ a”`可能不是2。 (8认同)
  • “都是多余的”-整个事情都是多余的,就像`42;`:-) (7认同)
  • 在这种情况下,“类型转换”一词已被完全理解。为什么有人会认为这与演员有关?没意义的单车棚! (7认同)
  • 此外,“ cast”的过去分词是“ cast”,除非您处于1500年代(https://english.stackexchange.com/questions/94565/can-casted-be-the-past-tense-铸造)。 (3认同)

Igo*_*nik 37

这被解释为((int)(+4)) * 5。也就是说,将表达式+4(应用于文字的一元加运算符4)转换为int使用C样式转换的类型,然后将结果乘以5