web-dev-qa-db-ja.com

Cに左側がない場合、&&演算子は何をしますか?

次のようなコードを持つCのプログラムを見ました。

static void *arr[1]  = {&& varOne,&& varTwo,&& varThree};

varOne: printf("One") ;
varTwo: printf("Two") ;
varThree: printf("Three") ;

左側に何もないので、&&が何をするのか混乱しています。デフォルトではnullと評価されますか?それともこれは特別なケースですか?

編集:私の質問に対して質問/コードをより明確にするためにいくつかの情報を追加しました。助けてくれてありがとう。これは、gcc固有の拡張機能の場合でした。

50
Joshua

これは「値としてのラベル」として知られる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
16
M.M