次のコードがあります。
int i=1;
printf((i==1)?" ":" " "hello");
printf(" " "hello");
printf
そして、最初の出力ではスペースのみが出力され、2 番目のprintf
出力ではスペースの後に文字列helloが続くことに驚いています。最初のものの場合、2番目のもののような出力を期待していました。しかし、ここに何か欠けているものがありますか。これで私を助けてください...
文字列リテラルの結合は字句機能であり、次のことを意味します。
(i==1) ? " " : " " "hello"
これと同じです:
(i==1) ? " " : " hello"
結果が得られる理由は明らかです。
i == 1
は true であるため、三項演算子は 2 つのオプションの最初の に評価されます" "
。まったく驚くべきことではありません。
C は、隣接する 2 つの文字列リテラルを自動的に結合します。
したがって、2番目の printf: へのパラメーター" " "hello"
は結合されて になり" hello"
、通常どおりに出力されます。
他の回答は、最初の printf がそのように機能する理由を説明しています。これはかなり明白なはずです。
三項演算子 ( i==1
) でテストされた条件は true と評価されるため、 の直後に式を返します?
。
三項演算子のセマンティクスは次のようなものです。
test_something?if_true:not_true
あなたのprintf
ステートメントは正常に機能します。
混乱の原因は、連結がいつ実行されるかについての誤解です。2 つの連続する文字列リテラルの結合は、実行時にプログラムではなく、コンパイル時にコンパイラによって行われます。したがって、最初の printf を解析する方法は 1 つしかありません。両方の文字列リテラルが式の「else」ブランチに属します。i をゼロに設定して出力を観察することでテストできます。