2

これを行う方が良いのではないかと思っています:

if((fd = open(filename, O_RDWR)) == -1)
{
fprintf(stderr, "open [ %s ]\n", strerror(errno));

return 1;
}

またはこれ

fd = open(filename, O_RDWR);
if(fd == -1)
{
    fprintf(stderr, "open [ %s ]\n", strerror(errno));

    return 1;
}

ご提案いただきありがとうございます。

4

10 に答える 10

12

うん、それを分割します。すべてを 1 つの行にまとめることで、何を得ることができますか? 比較してみましょう:

単線:

  • 利点:
  • 短所: 読みにくく、エラーが発生しやすい。(最初のリビジョンを検討してください。)

複数行:

  • 利点: 読みやすく、エラーが発生しにくい。
  • 短所:

明らかだと思います。:)


"1 行にまとめた方が理にかなっている場合もあります。たとえば、while ((c=getchar())!=EOF)"

それはそれでいいのですが、ここではそうではありません。分割しないほうがよい場合もありますが一般には分割しないでください。


「縦方向のスペースを節約できます」

1 行で関数が見えなくなってしまう場合は、1) 解像度が 640x480 を超えるモニターを購入し、2) より小さな関数を作成する必要があります。

本当に、私はその引数を理解したことがありません.1行の違いに関係なく、関数はどの画面にも簡単に収まる必要があります。


「複数の行があると複雑に見える」

そうではありませんが、これを 1 行にまとめると、間違いなく読みにくくなり、見た目も複雑になります。物事を分割すると、一度に 1 ビットずつ処理するのが簡単になります。2 行で処理が 2 倍複雑になると考えるべきではありません。

于 2010-04-29T02:56:04.520 に答える
6

何人かの人々は、2番目を支持して主張しています。私は彼らに同意しません。(明らかに) 最初の=vs.==にはマイナーな問題がありましたが、それはマイナーな問題であると私は主張します。

はるかに大きな問題は、(特に急いでいる場合) 人々がエラー チェックをスキップするのがあまりにも一般的であるif (whatever == -1)ことです。コードとエラーのチェックは実際には必要ありません。これは本当に悪い習慣です。これを読んでいるすべての人が、このようなエラーチェックをスキップした実際のコードを見たことがあることを事実上保証できます。

このようなコードでは、ファイルを開こうとする試みと、その際のエラーのチェックは、密接に結びついている必要があります。この 2 つを同じステートメントに入れると、適切な意図が反映されます。この 2 つを分離するのは明らかに間違っています。理由の如何を問わず、いつでも分離するべきではありません。これは単一の操作である必要あるため、単一の操作としてコーディングする必要があります。常に単一の操作として考え、コード化する必要があります。

私の意見では、そうしないことの言い訳は非常に弱いです。現実には、C を使用する人は誰でも、代入と条件付きテストを組み合わせたコードを読める必要があります。明らかな例として、while ((ch=getchar()) != EOF)かなりのようなループは、割り当てとテストを組み合わせて記述する必要があります。個別にテストしようとすると、EOF通常、コードが正しく機能しません。コードは大幅に複雑になります。

-対の問題も同様==です。そもそも欠陥が見えなかったので、2つを分離することで問題を回避するためにどれだけの効果があったかはわかりませんが、おそらくほとんど違いはなかったと思います. 条件であるはずのものに割り当てのみが含まれている場合に警告するコンパイラは、何年も前から存在しています (gcc など)。要するに、この投稿の一部で特定のタイプミスを犯し、他の部分では特定のタイプミスを犯していないという事実は、関連するものについて多くのことを証明しません (または正直に示してもいません)。二人の難しさ。

そのような証拠に基づいて、「 not」は「immediately」よりもタイプするのが難しいと思われる.それは前の文ですぐに出てきました。どのくらいの頻度でタイプミスしたかというと、「the」は英語で最も難しい単語の 1 つです。

于 2010-04-29T03:38:02.653 に答える
3

たぶん、括弧が順序を明確にする何か?

if((fd = open(filename, O_RDWR)) == -1)
于 2010-04-29T02:56:46.133 に答える
3

この例では、2 番目の方法の方が優れていると合唱に参加します。

より厳しいケースは、次のようなループにある場合です。

while ((c=getchar())!=-1)
{
  ... do something ...
}

while (true)
{
  c=getchar();
  if (c==-1)
    break;
  ... do something ...
}

そのような場合、ループを制御しているものを明確にするため、1 行で行うことを好みます。これにより、割り当てとテストの複雑な組み合わせの欠点が上書きされると思います。

于 2010-04-29T03:46:58.300 に答える
2

それはスタイルの問題です-あなたは優先順位を求めていません(大統領ではありません)。

多くの人は、後者の例がより明確であると主張します。

于 2010-04-29T02:55:56.350 に答える
2

標準的なイディオム (非常に一般的で、誰もがすぐにやろうとしていることを理解できるようなイディオム) を除いて、条件付きで代入を行うことは避けます。まず、読みにくい。次に、条件チェックで誤った代入演算子を使用してバグを作成する可能性があります (少なくとも、0 を false と解釈し、0 以外を true と解釈する弱く型付けされた言語では)。

于 2010-04-29T02:56:52.687 に答える
2

読みやすくするためには 2 番目の方が適していますが、最初の方法を頻繁に使用することはわかっています。特に引用符で囲まれているため、=演算子が優先され、割り当てられた値が返され、==演算子によって比較されます。

于 2010-04-29T02:57:13.620 に答える
1

これはスタイルの問題であり、主観的なものです。彼らは同じことをします。私は後者の方が読みやすく、デバッガーでブレークポイントを設定したり変数を調べたりするのが簡単であるため、後者を好む傾向があります。

于 2010-04-29T02:56:17.117 に答える
0

最初のケースは、入力ループを作成している場合はごく普通のことです。別の方法として、入力コマンドを 2 回 (ループの直前に 1 回、ループの最後に 1 回) 記述する必要があるためです。

while ( (ch=getchar()) != -1){
  //do something with it
}

同じ懸念がない if ステートメントでは、2 番目の方法がより一般的だと思います。

于 2010-04-29T04:01:19.247 に答える
0
(-1 == __whatever__) 

タイプミスを最小限に抑える

于 2010-04-29T02:57:17.853 に答える