【问题标题】:Why do C and C++ allow the expression (int) + 4*5?为什么 C 和 C++ 允许表达式 (int) + 4*5?
【发布时间】:2019-09-11 00:14:04
【问题描述】:
(int) + 4*5;

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

我知道这没有意义(也没有效果),但我想知道为什么会这样。

【问题讨论】:

  • (int)-4*5
  • 有一个名为cppinsights 的有用工具,它有助于从编译器前端的角度理解代码的外观。它还有一个在线版本,你可以看到它讲述了 your example 的内容(与你给出的答案相同的“括号”)
  • 此语句等效于+(int)+ 4*5;-(int)- 4*5;-+-+-(int)-+-+- 4*5; 不那么诗意;
  • 哪部分让您感到困惑?据我所知,你在问为什么你可以写 5 而不指示符号。
  • 不应该 C++ 警告你在 C++ 中不推荐 C 类型转换吗?

标签: c++ c casting language-lawyer


【解决方案1】:

这里的+unary + operator,而不是binary addition operator。这里没有添加。

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

您可以将那句话重新阅读为

(int) (+ 4) * 5;    

解析为

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

上面写着,

  1. 对整数常量值4 应用一元+ 运算符。
  2. 类型转换为int
  3. 乘以操作数5

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

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

【讨论】:

  • “转换”,而不是“类型转换”。类型转换是发生在演员身上的事情。
  • (+ 4) 不是使操作数+4,它意味着将一元+ 应用于操作数4,这确实是OP 的情况,但在其他情况下可能会导致整数提升或数组衰减。例如,char c = 0; sizeof +c == sizeof c 可能为假,sizeof +"a" 可能不是 2。
  • “两者都是多余的” - 整个事情都是多余的,就像42; :-)
  • 我认为使用术语类型转换没有任何问题。好像是I'm not the only one
  • @Ben 类型转换不是类型转换。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2020-06-24
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多