2016-04-07 9 views
4

これは私が0引数(argc-1falseに評価すること)で3進C演算子は空の第1ブランチをどのように解釈しますか?どうして?

  • それを実行した場合、それは42を印刷し

    #include <stdio.h> 
    int main(int argc, char **argv){ 
        printf("%d\n", argc-1?:42); 
        return 0; 
    } 
    

    (4.9.2)のコンパイルとgcc -Wallを使用して警告なしに実行するように思えます。

  • (n> = 1 args(argc-1trueと評価)とすると、n-1を出力します。

この場合、x?:yx?1:yに相当します。この標準、予想される行動、または単にGCCの奇妙なことはありますか?

+0

あまりにも遅すぎると、これは欺瞞であることがわかります。私は周りを探しました、正直。 – tucuxi

+0

"を1以上(argc-1をtrueにする)にすると、1"を出力します。_いいえ、それは '(argc-1)'を出力します。 4つの引数を指定すると4が出力され、42の引数を指定すると42が出力されます。 '(argc-1)'は 'int'であるためブール値ではありません。 –

+0

修正済み - ありがとうございます。 – tucuxi

答えて

5

これは、条件演算子の簡略版として知られているgcc extensionです。最初のオペランドがない場合

argc-1?:42 

この変化を使用する理由がある(と私は引用)

(argc-1)?(argc-1):42 

としてちょうど同じである

「それは便利になり、あります(マクロ引数であれば)副作用が含まれている可能性があります。そして、中間のオペランドを繰り返すと、副作用が2回発生します。中間のオペランドを省略すると、それを再計算する。

+0

しかし、プログラムは引数なしで実行されますか? '' argc''は1になり、プログラムは '' 0''を '' 1''、no? – ibi0tux

+0

Nitpick:条件と第1オペランドの両方として使用される式が1回だけ評価されることを除いて同じです。 – Quentin

+0

@ ibi0tuxあなたが言うことを意味するので、条件はTRUEになりますか?それはどうですか? –

関連する問題