• ベストアンサー

assert(!"abcd");がどうしてアサートに引っかかるのか理解できない

assert(!"abcd"); としたとき、実行すると上記文でアサートに引っかかります。 ですが、!"abcd"がどうしてfalseとして評価されるのか理解できません。 if()の()の中に"abcd"と書くと1として評価されるということなのでしょうか? char* c = "abcd"; とするとcにはaの部分のアドレスが入るのに、どうしてif("abcd")でabcdが1と評価されるのでしょうか? よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

Cでは、ポインタを定数として評価すべき場所では、以下のように扱われます。 ・ポインタの値が NULL であるとき → 定数0 と等しい ・ポインタの値が NULL でないとき → 定数0 とは等しくない さて、ちょっと回りくどい表現に見えると思います。 これは、NULL と 0 との区別などを含めたいろいろな話があるのですが、上記のような定義になります。 (NULL はあらゆる処理系で、必ずしも0番地になるとは限らないが、定数0と比較すると、必ず等しくなる、ということでありますが) ですから、"abcd" は、有効なポインタなので、「定数0とは等しくない」と評価されます。 最終的に ! (定数0とは等しくないもの) なので、0になります。 また、if("abcd") などと書くと、 "abcd" は、「定数0とは等しくない」ので、if() の条件は成立することになります。 if() をはじめとした、いわゆるCの「条件」は、「定数0と等しくないとき、真、定数0と等しいとき偽」という扱いになります。 つまり、if(何かのポインタ)は、if (何かのポインタ != 0) と等価でして、言い換えると、if( 何かのポインタ != NULL )と等価です。

rotofrot
質問者

お礼

ありがとうございます。 よく理解できました。助かりました。

その他の回答 (2)

回答No.2

> char* c = "abcd"; > とするとcにはaの部分のアドレスが入るのに、 アドレスが入る、すなわち"cは0ではない"てことです。 > どうしてif("abcd")でabcdが1と評価されるのでしょうか? 1と評価されるのではありません。"0ではない"と評価されます。 "0ではない" → "falseではない" → true となります。

rotofrot
質問者

お礼

0ではないの反対だから0というわけですね。 ありがとうございます。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>!"abcd"がどうしてfalseとして評価されるのか理解できません。 仕様です。

rotofrot
質問者

お礼

ありがとうございます。

関連するQ&A