質問 |
||
| 質問者: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 |
|
| この回答へのお礼 | ありがとうございます。 |