在定义整型常量表达式时间接禁止(或不禁止)运算符(在C中)

在定义整型常量表达式时间接禁止(或不禁止)运算符(在C中),c,syntax,c99,language-lawyer,C,Syntax,C99,Language Lawyer,在标准C(C99/C11)中,我们有所谓的整数常量表达式,这些常量表达式的操作数都是常量整数 以下定义适用: 标准C99第6.6节(第6段): 整数常量表达式)应为整数类型,且 仅具有整数余项、枚举常量、, 字符常量,sizeof表达式,其结果为整数 常量和作为的直接操作数的浮点常量 演员 这出现在更一般的常量表达式的定义之后 (由于整数常量表达式是在常量表达式之后定义的,因此我假设前者是最后一个表达式的特例。) 另一方面,条件表达式被视为常量表达式,受以下规则约束: 标准C99,第6.6节:

在标准C(C99/C11)中,我们有所谓的整数常量表达式,这些常量表达式的操作数都是常量整数

以下定义适用:

标准C99第6.6节(第6段):

整数常量表达式)应为整数类型,且 仅具有整数余项、枚举常量、, 字符常量,sizeof表达式,其结果为整数 常量和作为的直接操作数的浮点常量 演员

这出现在更一般的常量表达式的定义之后
(由于整数常量表达式是在常量表达式之后定义的,因此我假设前者是最后一个表达式的特例。)

另一方面,条件表达式被视为常量表达式,受以下规则约束:

标准C99,第6.6节:

常量表达式不得包含赋值、增量、, 减量、函数调用或逗号运算符,除非 包含在未计算的子表达式中

通过展开条件表达式的含义,我们可以归纳为后缀表达式和/或一元表达式

现在,如果我们将这些约束应用于整型常量表达式,我们大致可以得到它们由条件表达式组成,条件表达式的限制方式是:每个操作数都是整型/枚举/字符常量(或紧跟在强制转换之前的浮点常量),并且没有赋值、增量、,减量、函数调用或逗号运算符

  • 简单地说,让我们假设E是这样一个表达式,没有任何
    sizeof
    运算符,也没有未计算的操作数
我的问题是:
E中是否间接禁止以下操作员:

  • (地址)
  • *
    (间接)
  • []
    (数组下标)
  • (结构成员)
  • ->
    (指向结构成员的指针)
此外,复合文字是否也被禁止

传统注释:我有兴趣回答严格一致性程序(C99/C11)的这个问题

我认为它们不可能在E的任何子表达式中,但我不确定这是否完全正确。我的快速推理如下:

  • 如果FE的整数常量子表达式,则F根据定义具有整数类型
    T
  • 如果一元运算符
    &
    出现在E中的F之前,则&F在具有“指向T的指针”类型的操作数中,这在E中是不允许的(尽管如此,F不是对象,而是一个整数值,因此
    &code>无法应用)。因此,
    &
    不能出现在任何E
  • 由于F没有任何指针类型,因此表达式
    *F
    没有意义
  • 下标运算符
    []
    用于指示数组中的元素。这意味着我们在E中会有类似
    A[N]
    的内容。这里,
    N
    必须是整数常量表达式。但是我们注意到,
    A
    也是一个操作数,但它是
    数组
    类型的对象,这在E中是不允许的。这意味着数组下标运算符不能出现在E
  • 如果我们在E中有操作符
    ->
    ,这意味着它们在E中使用,如下所示:
    S.memb pS->memb
    。因此,我们有操作数
    S
    ,其类型为
    struct
    union
    pS
    ,后者是指向struct或union的
    指针。但是E中不允许使用此类“操作数”
    
  • E中不允许使用复合文本,因为它们是左值,这意味着在程序运行时它们将有一个地址。由于编译器无法知道这样的地址,因此包含复合文字的表达式不被视为常量
你认为我的推理正确吗?

您是否知道例外情况,其中一些运算符或表达式可以是整型常量表达式的[部分](如我表示E的受限情况)

ICE只需要有值(行话中的右值)作为构成它的主要表达式,而不需要对象(左值)

如果你从这里开始排除操作符,你会看到

  • 任何需要左值作为操作数的运算符都不能使用(赋值、递增、递减、一元
    &

  • 生成左值的运算符都不能使用(一元
    *
    、数组成员
    []
    、成员
    ->

  • 需要将
    结构作为参数的
    运算符,因为

    • struct

    • 复合文字用词不当,它们是对象

    • 也不允许函数调用

这些运算符中的一些可能会出现在未计算(或不应该计算)的位置,特别是
\u Alignof
、宏
偏移量
大小

的某些外观,你是在开玩笑吧?你写信了吗