【问题标题】:Clarification on integer constant expressions关于整数常量表达式的说明
【发布时间】:2012-12-14 10:34:27
【问题描述】:

我在某处读到整数常量表达式包含整数常量,例如:

(5 + 5) //integer constant expression

这是我见过的唯一例子。

现在,从标准中说:

(C99 6.6/6) 整数常量表达式应具有整数类型 并且只能有整数常量、枚举的操作数 常量、字符常量、sizeof 表达式,其结果为 整数常量和立即数的浮点常量 强制转换的操作数。整数常量表达式中的强制转换运算符 只能将算术类型转换为整数类型,除了作为部分 sizeof 运算符的操作数。

那么,如果我是对的,下面的所有这些整数表达式都是吗?

int i; float f = 3.14f;

i = 42;
i = f;
i = (int)(5/3.14f);

【问题讨论】:

    标签: c c99


    【解决方案1】:

    (int)(5/3.14f) 不是整数常量表达式。

    您使用的不是强制转换的立即操作数的浮动常量。

    当然,在i = f; 中,对象f 不是整数常量表达式。

    【讨论】:

    • 你确定吗? (5/3.14f) 本身就是一个浮动的 constexpr。 GCC 和 clang 都可以让我编译 const int x = (int)(5/3.14f);-Wall -ansi -std=c89 -pedantic
    • @H2CO3: (5/3.14f) 是一个算术常量表达式,而不是一个浮点常量。整个表达式仍然是算术常量表达式,但(根据 §6.6)不是整数常量表达式。
    • @H2CO3 尝试用这个表达式sizeof (struct { int a:((int) (5/3.14f));}) 进行编译,你会得到想要的警告。
    • 您能否举例说明cast 的立即操作数 是什么意思?
    • @user963241:(int)(3.14f)。强制转换必须应用于常量,而不是复合常量表达式。
    猜你喜欢
    • 1970-01-01
    • 2013-07-10
    • 2012-07-21
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多