28

しばらくして、コードの一部に次の構文があることに気付きました。

if( NULL == var){
   //...
}

また

if( 0 == var){
  //...
}

および同様のもの。

これを書いた人が一般的な方法ではなくこの表記法を選んだ理由を誰か説明してもらえますかvar == 0?)

スタイルの問題ですか、それとも何らかの形でパフォーマンスに影響しますか?

4

7 に答える 7

40

これは、次のような間違いを回避するためのメカニズムです。

if ( var = NULL ) {
  // ...
}

右側に変数名を付けて記述すると、コンパイラは特定の間違いをキャッチできます。

if ( NULL = var ) {  // not legal, won't compile
  // ...
}

もちろん、変数名が等号の両側に表示され、このスタイルが魅力的でないと感じる人がいる場合、これは機能しません。

編集:

Evan がコメントで述べたように、適切なコンパイラは、警告を有効にすると、これについて警告します。たとえば、gcc -Wall次のようになります。

warning: suggest parentheses around assignment used as truth value

コンパイラで常に警告を有効にする必要があります。これは、エラーを見つけるための最も安価な方法です。

最後に、Mike B が指摘しているように、これはスタイルの問題であり、プログラムのパフォーマンスには影響しません。

于 2008-12-16T03:20:31.983 に答える
12

間違えて入れたら

if ( var = NULL )

それ以外の

if ( var == NULL )

その場合、コンパイラの警告のみが表示されます。順序を逆にすると:

if ( NULL == var )

あなたが置くとコンパイルエラーが発生します

if ( NULL = var )

個人的に、私はそのように書かれたコードを読むのが嫌いで、コーディングの最初の年に一度だけその間違いを犯しました. =)

于 2008-12-16T03:26:23.220 に答える
7

を避けるために

if (var = NULL)

バグ

于 2008-12-16T03:17:57.200 に答える
5

The Guerrilla Guide to Interviewing のJoel On Software の引用:

ときどき、C プログラマーが if (0==strlen(x)) のように書いて、定数を == の左側に置くのを目にすることがあります。これは本当に良い兆候です。これは、= と == を混同して何度も刺され、その罠を回避するために新しい習慣を学ばなければならなかったことを意味します。

(私はこの「ベスト プラクティス」のファンではありません。)

于 2008-12-16T03:25:30.427 に答える
1

ところで、私は何年にもわたって新しいプログラマーに C を教えているのを観察してきました。"=" を "get" として、"==" を等号として読むように自分自身を訓練すれば、それ自体がこれらの多くからあなたを救うでしょう。バグ。それからあなたは読んだ

if( x = 0){

「if x gets 0 then」のように、それは奇妙に聞こえ始めます。

于 2008-12-16T03:29:05.973 に答える