簡體   English   中英

陣列初始化中的三元運算符

[英]Ternary operator in array initalization

在數組初始化中使用tenary運算符和常量有效C99?

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

是的你可以。 從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};
}

此外,對於具有自動存儲持續時間的對象,您不限於將常量表達式作為條件表達式的兩個子表達式。 它們也可以引用范圍內的任何對象。

不。來自clang

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM