c - 数组初始化中的三元运算符

标签 c c99

在具有有效 C99 常量的数组初始化中使用三元运算符吗?

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

最佳答案

是的,你可以。从初始化程序的语法生成开始:

6.7.8 初始化

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

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

All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

接着是 assignment-expression 的产生,我们看到了

6.5.16 赋值运算符

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

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

6.6 常量表达式

constant-expression:
         conditional-expression

具有以下约束和语义的段落:

Constant expressions shall not contain assignment, increment, decrement, function-call, or comma operators, except when they are contained within a subexpression that is not evaluated.

More latitude is permitted for constant expressions in initializers. Such a constant expression shall be, or evaluate to, one of the following:

  • an arithmetic constant expression,
  • a null pointer constant,
  • an address constant, or
  • an address constant for an object type plus or minus an integer constant 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};
}

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

关于c - 数组初始化中的三元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48657128/

相关文章:

c - 主线程和工作线程初始化

c - 用 C 读取文本文件,跳过第一行

c - 删除功能是否保证删除文件?

c99 中 float 的编译时间/宏交换

c - 枚举C中的结构字段

c - 有人为 MSP430 的 IAR Embedded Workbench 实现了 __getzone() 吗?

c - 从 C 语言中读取文件并执行条件逻辑

创建一个用户空间指针来保存回文并将该指针传递给 copy_from_user(void *to, const void __user *mypointer, unsigned long count)

c - Sublime 文本识别扩展多行的功能

c - 有什么方法可以在 C 中的 fscanf 中包含原始参数