3

次のコードがあります。

    int i=1;
    printf((i==1)?" ":"   " "hello");
    printf(" " "hello");

printfそして、最初の出力ではスペースのみが出力され、2 番目のprintf出力ではスペースの後に文字列helloが続くことに驚いています。最初のものの場合、2番目のもののような出力を期待していました。しかし、ここに何か欠けているものがありますか。これで私を助けてください...

4

5 に答える 5

8

文字列リテラルの結合は字句機能であり、次のことを意味します。

(i==1) ? " " : "   " "hello"

これと同じです:

(i==1) ? " " : "   hello"

結果が得られる理由は明らかです。

于 2012-06-30T20:44:49.993 に答える
2

i == 1は true であるため、三項演算子は 2 つのオプションの最初の に評価されます" "。まったく驚くべきことではありません。

于 2012-06-30T20:43:19.120 に答える
2

C は、隣接する 2 つの文字列リテラルを自動的に結合します。

したがって、2番目の printf: へのパラメーター" " "hello"は結合されて になり" hello"、通常どおりに出力されます。

他の回答は、最初の printf がそのように機能する理由を説明しています。これはかなり明白なはずです。

于 2012-06-30T20:44:52.687 に答える
1

三項演算子 ( i==1) でテストされた条件は true と評価されるため、 の直後に式を返します?

三項演算子のセマンティクスは次のようなものです。

test_something?if_true:not_true

あなたのprintfステートメントは正常に機能します。

于 2012-06-30T20:44:42.913 に答える
1

混乱の原因は、連結がいつ実行されるかについての誤解です。2 つの連続する文字列リテラルの結合は、実行時にプログラムではなく、コンパイル時にコンパイラによって行われます。したがって、最初の printf を解析する方法は 1 つしかありません。両方の文字列リテラルが式の「else」ブランチに属します。i をゼロに設定して出力を観察することでテストできます。

于 2012-06-30T20:48:52.903 に答える