阵列初始化中的三元运算符

时间:2018-02-07 06:14:26

标签: c c99

在数组初始化中使用tenary运算符,并且常量有效C99?

uint8_t foo[] = {bar? 9U:20U};

2 个答案:

答案 0 :(得分:7)

是的,你可以。从initalizer的语法生成开始:

6.7.8初始化

initializer:
       assignment-expression
       { initializer-list }
       { initializer-list , }
initializer-list:
       designation(optional) initializer
       initializer-list , designation(optional) initializer

该部分中初始化程序的唯一相关(在我看来)约束是它必须是具有静态存储持续时间的对象的常量表达式:

  

具有静态的对象的初始值设定项中的所有表达式   存储持续时间应为常量表达式或字符串文字。

继续生成assignment-expression后,我们看到了

6.5.16分配运营商

assignment-expression:
        conditional-expression
        unary-expression assignment-operator assignment-expression

条件表达式也是有效的赋值表达式。因此它可能在初始化列表中显示为初始值设定项。唯一需要检查的是它可以是具有静态存储持续时间的对象的有效常量表达式。

6.6常量表达式

constant-expression:
         conditional-expression

使用以下约束和语义段落:

  

常量表达式不应包含赋值,增量,   递减,函数调用或逗号运算符,除非它们是   包含在未评估的子表达式中。

     

初始值设定项中的常量表达式允许更多纬度。   这样的常数表达式应该是或者评估为其中之一   以下内容:

     
      
  • 算术常量表达式
  •   
  • 一个空指针常量,
  •   
  • 地址常量,或
  •   
  • 对象类型的地址常量加上或减去整数常量表达式。
  •   

所以上述所有内容都适用于以下有效程序:

#include <stdint.h>
#include <stdlib.h>

#define BAR 1

uint8_t foo[] = {BAR ? 9U:20U};

int main(void) {
   int bar = rand();
   uint8_t foo[] = {bar ? 9U:20U};
}

此外,对于具有自动存储持续时间的对象,您不能将常量表达式限制为条件表达式的两个子表达式。他们也可以引用范围内的任何对象。

答案 1 :(得分:2)

没有。来自clang

example.c:4:15: warning: initializer for aggregate is not a compile-time
      constant [-Wc99-extensions]
        int foo[] = {bar? 9U:20U};
                     ^~~~~~~~~~~