定数が有効な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
そのセクションのイニシャライザに関連する(私の意見では)唯一の制約は、静的ストレージ期間を持つオブジェクトの定数式でなければならないということです。
静的ストレージ期間を持つオブジェクトの初期化子のすべての式は、定数式または文字列リテラルでなければなりません。
の生産に続いて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};
}
さらに、自動保存期間のあるオブジェクトの場合、条件式の2つのサブ式として、定数式に制限されません。スコープ内の任意のオブジェクトを参照することもできます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加