[英]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.