if文で見たのはこんな感じでした。
if((var = someFunc()) == 0){
...
}
声明は
(var = someFunc())
どのような環境にいても、常に var の最終値を返しますか?
if文で見たのはこんな感じでした。
if((var = someFunc()) == 0){
...
}
声明は
(var = someFunc())
どのような環境にいても、常に var の最終値を返しますか?
これは、変数に割り当て、同時に戻り値を比較する1行の方法です。
比較演算子は代入演算子よりも優先順位が高いため、代入の前後に括弧が必要です。そうでない場合var
は、の値が割り当てられますsomeFunc() == 0
。
これは単に間違っています。var
が割り当てられ、その値が定数によって上書きされます0
。したがって、関数の戻り値は失われ、if
常に失敗します。if
ほとんどのコンパイラは、今日ではおそらくそれについて警告を発するでしょうif
。おそらく意図されていたことを行う正しい方法は、
if((var = someFunc()) == 0) {
(注意してください、これは、よくある初心者の間違いを装って脆弱性を持ち込もうとする悪意のあるコードである可能性もあります。最近、誰かが UID を 0 に割り当てた Linux カーネルにチェックを密輸しようとしたケースがありました (つまり、 root であることを確認するふりをしている間. ただし、機能しませんでした.)
これは正しいです、私はいつもそれを使用しています
if ((f=fopen(s,"r"))==NULL) return(fprintf(stderr,"fopen(%s,r) が失敗しました。errno=%d, %s\n",s,errno,strerror (エラー番号))); /* ファイル s を正常に開き、FILE *f から好きなように読み取ります */
メモリを calloc() するときにも使用します。
someFunc (私の場合は fopen または calloc) の戻り値を変数に代入し、その戻り値もテストします。これは、代入とテストを別々にデバッグしたくないという意味のショートカットです。