コード内のバグを見つけるのに非常に苦労しましたが、その結果、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 のみを保存します。