次のようなコードを持つCのプログラムを見ました。
static void *arr[1] = {&& varOne,&& varTwo,&& varThree};
varOne: printf("One") ;
varTwo: printf("Two") ;
varThree: printf("Three") ;
左側に何もないので、&&
が何をするのか混乱しています。デフォルトではnullと評価されますか?それともこれは特別なケースですか?
編集:私の質問に対して質問/コードをより明確にするためにいくつかの情報を追加しました。助けてくれてありがとう。これは、gcc固有の拡張機能の場合でした。
これは「値としてのラベル」として知られるgcc拡張です。 gccドキュメントへのリンク 。
この拡張機能では、&&
はlabelに適用できる単項演算子です。結果は、タイプvoid *
の値です。この値は後でgoto
ステートメントで逆参照され、実行がそのラベルにジャンプするようになります。また、この値ではポインター演算が許可されています。
ラベルは同じ関数内にある必要があります。または、コードが「ネストされた関数」のgcc拡張を使用している場合は、囲み関数内。
次に、機能を使用してステートマシンを実装するサンプルプログラムを示します。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
void *tab[] = { &&foo, &&bar, &&qux };
// Alternative method
//ptrdiff_t otab[] = { &&foo - &&foo, &&bar - &&foo, &&qux - &&foo };
int i, state = 0;
srand(time(NULL));
for (i = 0; i < 10; ++i)
{
goto *tab[state];
//goto *(&&foo + otab[state]);
foo:
printf("Foo\n");
state = 2;
continue;
bar:
printf("Bar\n");
state = 0;
continue;
qux:
printf("Qux\n");
state = Rand() % 3;
continue;
}
}
コンパイルと実行:
$ gcc -o x x.c && ./x
Foo
Qux
Foo
Qux
Bar
Foo
Qux
Qux
Bar
Foo