1

これの理由は何ですか?ポインタがnullの場合、残りの条件は評価されないと思いました。

// doesn't work:
char *ptr = somefunction();

if (ptr && ptr[0] == '1' || ptr[0] == 't')
  // ...



// does work:
char *ptr = somefunction();
if (ptr)
    if (ptr[0] == '1' || ptr[0] == 't')
        // ...
4

4 に答える 4

5
ptr && ptr[0] == '1' || ptr[0] == 't'

意味:

  • if ptr && ptr[0] == '1'(false、ptrはnullでありptr[0] == '1'、評価されないため)
  • またはptr[0] == 't'(ブーム)

使用する:

ptr && (ptr[0] == '1' || ptr[0] == 't')

代わりは。

于 2012-05-17T22:54:38.610 に答える
3

&&優先度が高い||ため、コードは次のようになります。

if ((ptr && ptr[0] == '1') || ptr[0] == 't')

前者が失敗した場合(...&&..)、後半||が評価されます。

于 2012-05-17T22:55:26.260 に答える
1

Null ptr&&逆参照されたNullptrがあり、セグメンテーション違反が発生します。

Cには、if(ptr == NULL)のようなステートメントを実行するオプションがあります。nullポインターが検出されたときに、常に条件をfalseと評価した場合、このようなステートメントは機能しません。

于 2012-05-17T23:30:25.240 に答える
1

評価の順序が正しくありません。これは機能します:

if (ptr && (ptr[0] == '1' || ptr[0] == 't'))

基本的に、両方&&||コードを含む場合は常に、意図したとおりに機能するように、そこに括弧が必要です。

于 2012-05-17T22:54:50.797 に答える