ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

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

よろしくお願いいたします。
質問投稿日時:08/04/15 01:11
質問番号:3949856
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:AsanoNagi 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 )と等価です。
種類:回答
どんな人:一般人
自信:参考意見
回答日時:08/04/15 09:32
回答番号:No.3
この回答へのお礼ありがとうございます。
よく理解できました。助かりました。

回答

良回答10pt

回答者:episteme > char* c = "abcd";
> とするとcにはaの部分のアドレスが入るのに、

アドレスが入る、すなわち"cは0ではない"てことです。

> どうしてif("abcd")でabcdが1と評価されるのでしょうか?

1と評価されるのではありません。"0ではない"と評価されます。
"0ではない" → "falseではない" → true となります。
種類:回答
どんな人:専門家
自信:自信あり
回答日時:08/04/15 01:51
回答番号:No.2
この回答へのお礼0ではないの反対だから0というわけですね。
ありがとうございます。

回答

 

回答者:koko_u_ >!"abcd"がどうしてfalseとして評価されるのか理解できません。
仕様です。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/15 01:17
回答番号:No.1
この回答へのお礼ありがとうございます。
 
最新から表示回答順に表示良回答のみ表示