私はCを学んでおり、演習として、セミコロンを使用せずに簡単なプログラムを作成しようとしています。ステートメントの置き換えにreturn 0
問題がありましたが、これがCでそれを行う(唯一の?)方法であることがわかりましたif(exit(0),0){}
。
このステートメントはどの程度正確に機能しますか?
exit()
fromがvoid関数であることは知っていますが、どの部分stdlib
が機能しているかわかりません(残りは私には明らかです)。,0
if
Cの,
演算子は両方の引数を評価し、2番目の引数の値を返します。だから式
exit(0), 0
呼び出しexit(0)
て0を返します。したがって、投稿したコードは実質的に次のようになります。
exit(0);
if (0) {}
ただし、exit()
プロセスを終了する必要があるため、これが実際に戻ることはありません。このイディオムは、偽のコンパイラ警告を防ぐために使用されているだけです。
Cを学びながら、セミコロンなしでプログラムを書く方法を理解することには価値がありません。あなたはCを学ぶことから、役に立たないトリックで遊ぶことに逸脱したように聞こえます。
ただし、質問に答えるために、コンマで区切られた複数のステートメントがある場合、「結果」が最後のステートメントになります。if
評価する値を持つステートメントが必要exit()
です。はvoidであるため、値はありません。そのコンマに続く0は、の値を提供しますif
。
あなたが書くとき
int i = (5, 7);
i
割り当てられ 7
ていない 5
括弧内,
の区切り式は、LHSからRHSに実行されます。
同様if(exit(0), 0) == if(0)
に、exit(0)が最初に実行されます。(空白に最適化しない)
次の例とその出力は、その動作をある程度理解するのに役立ちます。
#include<stdio.h>
int fun(char* c){
printf("%s\n", c);
return 0;
}
int main(){
int i = (fun("1"),fun("2"));
if(fun("3"),7){
printf("ONE %d", i);
}
else{
printf("TWO %d", i);
}
}
その出力:
1
2
3
ONE 0
ONE
であるため、出力0の最後が特に出力されていることに注意if(fun("3"),7) == if(7)
してください。それ以外の場合はをfun()
返します0
。
カンマ演算子です。
これは、演算子の右の値が返され、左の部分が評価されることを意味します。
この場合、ステートメントexit()
に入れることができるように使用され、if
ステートメントでチェックされるパラメーターとして0が渡されますif
(void値では機能しません)。
;
コンマ演算子は、通常のプログラミングと同じ効果を与えるものとして扱うことができます。実際、この場合、内部のすべての式if
が評価されます。ただし、exit()
が呼び出されると、プログラムは終了します。カンマ演算子の詳細については、このリンクをたどってください