c - while ループの代入内で括弧を使用していますか?

okwaves2024-01-25  7

コード内のバグを見つけるのに非常に苦労しましたが、その結果、while ループ内の括弧のペアを見逃していたことが判明しましたが、その重要性はまだわかりません。

では、これらの行が互いに異なる理由は次のとおりです。

 while (( (bytes_read = read(inputFILE, buffer, BUFF_SIZE)) > 0))
 while (( bytes_read = read(inputFILE, buffer, BUFF_SIZE) > 0))

2行目はバグで、ファイルにバッファを書き込もうとすると、何があっても1文字しか書き込まれませんでした。この余分な括弧はどのような変化をもたらしましたか

正しい行を含むループ全体は次のとおりです:

while (( (bytes_read = read(inputFILE, buffer, BUFF_SIZE)) > 0)){
        bytes_write = write(outputFILE, buffer, bytes_read);
        if (bytes_write != bytes_read)
            fatal("Couldnt write data to %s", argv[2]);

1

これらの行はどちらもコードには余分な括弧が含まれています。余分な括弧のセットは、コンパイラがこの種のエラーを検出するために行うチェックを無効にするため、その余分なセットは削除する必要があります。

– user3386109

2020 年 9 月 4 日 21:38



------------------------

関係演算子 >は代入演算子 = よりも優先されます。したがって、コードの 2 行目は次のように解析されます。

while (( bytes_read = (read(inputFILE, buffer, BUFF_SIZE) > 0)) )

言い換えると、read の戻り値が 0 と比較され、その結果 (0 または 1) が bytes_read に割り当てられます。



------------------------

違いは次のとおりです。

(something = something_else) > 0

(something_else を何かに代入し、それがゼロより大きいかどうかを確認します)

以下との比較:

something = something_else > 0

これは

と同じです
something = (something_else > 0)

(something_else が 0 より大きいかどうかを確認し、それを何かに割り当てます)。

最初のメソッドは、something_else の実際の値を変数 something に保存します。 2 番目のものは、0 より大きいかどうかに応じて 1 または 0 のみを保存します。

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。