【问题标题】:What is a diference between ((int) a) and (int(a))?((int) 和 (int(a)) 有什么区别?
【发布时间】:2020-05-05 14:40:55
【问题描述】:

((int) a)(int(a)) 有什么区别?

第二个表达式在纯“С”中有效吗?

【问题讨论】:

  • 在“纯 C”中检查某些内容是否有效时,一个好的开始是使用 -std=c11 -pedantic-errors(或您的编译器的等效项)进行编译。它会在 99% 的情况下为您提供正确答案。
  • @Evg - 不是我的头顶。但编译器有时仍然存在一致性错误,因此我的误差率为 1%。
  • “纯C”是指“C”?

标签: c++ c type-conversion


【解决方案1】:

在 C++ 中它们之间没有区别。但是,C 仅支持第一次强制转换操作。

tutorial看这个例子:

double x = 10.3;
int y;
y = (int) x;    // c-like cast notation 
y = int (x);    // functional notation

【讨论】:

    【解决方案2】:

    (type_name)identifier(或更具体地说是(type_name)cast_expression (6.5.4))是一种 C 风格的演员表。 (int(a)) 在 C 中的语法无效,除非 a 是一个类型。然后它可能是转换为采用类型a 并返回int 的函数的一部分,这将是一个语法上有效但语义上无效的转换,所以也没用。 C 中的int(a); 将是一个等同于int a; 的声明。

    C++ 确实支持转换的 int(a) 语法(类型名称必须是单个单词;它不适用于例如 unsigned long(a)),因为 int(类型名称)然后变成 kind类似于具有参数化构造函数的类型(尽管这在 C++ 中与 C 风格的转换组合在一起,作为一种已弃用的转换方式,并且更细粒度/可见的 static_cast/reinterpret_cast/const_cast 转换是首选)。

    C++ 语法看起来很有趣,因为它可以工作 (C++):

    typedef int type_name;
    type_name (a); //a declaration
    a=0;
    printf("%d\n", type_name(a)); //type_name(a) is a cast expr here
    

    【讨论】:

    • 不会 int(a) 是一个匿名 int 对象,构造函数的参数为​​ as ,与 string("abc") 是用 char* "abc" 构造的匿名字符串完全相同论点)?
    • @Christophe 是的,这确实更有意义。
    猜你喜欢
    • 1970-01-01
    • 2021-05-04
    • 2020-12-27
    • 2014-10-19
    • 1970-01-01
    • 2020-07-15
    • 2010-10-11
    • 2014-11-05
    • 2019-06-22
    相关资源
    最近更新 更多