←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4270

if文
投稿者---ちん(2005/07/13 10:03:22)


こんにちは。
if文について質問があります。

C言語は勉強中です。

サイト(初心者のためのポイント学習C言語)を見ていて
解らなかったのですが...。
(http://www9.plala.or.jp/sgwr-t/c/sec06-1.html)

(注2)のところで、if(a!=0)とif(a)が等しいと
記述されているのですが、意味が解りません。

お恥ずかしい限りです。

どなたか教えて頂けないでしょうか。

宜しくお願い申し上げます。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:if文 4271 まきじ 2005/07/13 10:19:29
<子記事> Re:if文 4287 ちん 2005/07/14 09:35:01


No.4271

Re:if文
投稿者---まきじ(2005/07/13 10:19:29)


>(注2)のところで、if(a!=0)とif(a)が等しいと
>記述されているのですが、意味が解りません。

if 文の条件は、非0 ならば真、0 ならば偽になるので、
a が 10 の場合、10 != 0 は、1 が返り、if 文の条件は真となり、
a が 0 の場合、0 != 0 は、0 が返り、if 文の条件は偽となります。


この投稿にコメントする

削除パスワード

No.4285

Re:if文
投稿者---RAPT(2005/07/13 23:41:25)


C/C++言語では、
if( a )
と記述した場合、暗黙的に
if( (a) != 0 )
と記述したように評価される、という仕様です。



この投稿にコメントする

削除パスワード

No.4287

Re:if文
投稿者---ちん(2005/07/14 09:35:01)


こんにちは。
まきじさん、RAPTさんありがとうございます。

まきじさんがお話されていることは、尤もなことだと思います。

ただ僕には、aが何なのか判らないのに「!aとa==0は同じ」と書かれて
いることが解りません。

RAPTさんがお話されているように、「if( a )とif( (a) != 0 )は同じ」
と憶えてしまった方が良いのでしょうか。


この投稿にコメントする

削除パスワード

No.4288

Re:if文
投稿者---shu(2005/07/14 10:02:41)


例えば、こんなプログラムは参考になるでしょうか?

#include <stdio.h>

int main( void )
{
    int i;
    
    for (i = 0; i < 128; i++)
        printf( "%d:%d:%d\t", i, !i, !!i );
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.4290

Re:if文
投稿者---REE(2005/07/14 10:42:50)


>ただ僕には、aが何なのか判らないのに「!aとa==0は同じ」と書かれて
>いることが解りません。

あなたは、どう言う場合に違うかもしれないと思うのでしょうか?


>RAPTさんがお話されているように、「if( a )とif( (a) != 0 )は同じ」
>と憶えてしまった方が良いのでしょうか。

あなたは、どう言う場合に違うかもしれないと思うのでしょうか?



この投稿にコメントする

削除パスワード

No.4292

Re:if文
投稿者---YuO(2005/07/14 11:57:37)


>ただ僕には、aが何なのか判らないのに「!aとa==0は同じ」と書かれて
>いることが解りません。

!aの定義です。

ISO/IEC 9899:1999 6.5.3.3 Unary arithmetic operators / Paragraph.5

The expression !E is equivalent to (0==E).





この投稿にコメントする

削除パスワード

No.4293

Re:if文
投稿者---とおり(2005/07/14 12:11:19)


>ただ僕には、aが何なのか判らないのに「!aとa==0は同じ」と書かれて
>いることが解りません。

まきじさんが

> if 文の条件は、非0 ならば真、0 ならば偽になるので、

とおっしゃっているように、C言語では、「0以外を真」「0を偽」とします。
プログラムで示すと、
if (1) { x=1; }
では x=1; は実行されます。

逆に、
if (0) { x=1; }
では x=1; は実行されません。

同様に
if (a) { x=1; }
とした時は、
[1. a=1 の場合]は、if (1) { x=1; } と同じこととなり、 x=1; は実行されます。
[2. a=0 の場合]は、if (0) { x=1; } と同じこととなり、 x=1; は実行されません。


ここで、'!'が付いた場合はどうなるかというと、'!'は否定なので、条件がひっくりかえります。
つまり、「0なら真」「0以外なら偽」ということになり、(ちょっと言い方へんかも)
プログラムでしめすと、
if (!1) { x=1; }
では x=1; は実行されません。

逆に、
if (!0) { x=1; }
では x=1; は実行されます。


では、ここから本題ですが、
Å)if (!a) { x=1; }

B)if (a == 0) { x=1; }
はそれぞれどのような動作を行うかといいますと、

[1. a=1 の場合]
A)aは1なので if (!1) { x=1; } 同じこととなり、x=1; は実行されません。
B)aは1なので 1==0 は偽(正しくない)だから「0が返って」if (0) { x=1; } と同じこととなり、x=1; は実行されません。
→AもBも同一の結果を得ます。(x=1; は実行されない)

[2. a=0 の場合]
A)aは0なので if (!0) { x=1; } 同じこととなり、x=1; は実行されます。
B)aは0なので 0==0 は真(正しい)だから「1が返って」if (1) { x=1; } と同じこととなり、x=1; は実行されます。
→AもBも同一の結果を得ます。(x=1; は実行される)

※'0'以外は全てパターン1 と同一の動きをします。


ゆえに、「!aとa==0は同じ」と言えます。

#こんな説明で良いかな。。。ドキドキ。。
#識者の方々に査読をお願いしたいです。コピペ多様してるから、書き間違いあるかも。。。




この投稿にコメントする

削除パスワード

No.4294

Re:if文
投稿者---まきじ(2005/07/14 13:33:10)


>ただ僕には、aが何なのか判らないのに「!aとa==0は同じ」と書かれて
>いることが解りません。

int main(void){

    int a;
    
    a = 0;
    if( (!a) == (a == 0) ) puts("true");
    else puts("false");

    a = -1;
    if( (!a) == (a == 0) ) puts("true");
    else puts("false");

    a = 2;
    if( (!a) == (a == 0) ) puts("true");
    else puts("false");
    
    return 0;
}

a の値を色々変えて実行してみてください。
"true" としか表示されないはずです。


この投稿にコメントする

削除パスワード

No.4296

Re:if文
投稿者---円零(2005/07/14 15:14:27)


いっそのこと全ての値について調べてみるとか。

#include <stdio.h>
#include <stdlib.h>
/*#include <time.h>*/

#define VOIDPOINTER 0
#define INT 1
#define DOUBLE 2
#define T 3

int typesize[T] = {sizeof(void *), sizeof(int), sizeof(double)};

int ev_voidpointer(void *p){
    void **pp = (void **)p;
    return ( (!*pp) - (*pp == 0) );
}

int ev_int(void *p){
    int *pi = (int *)p;
    return ( (!*pi) - (*pi == 0) );
}

int ev_double(void *p){
    double *pd = (double *)p;
    return ( (!*pd) - (*pd == 0) );
}

int (*evaluate[T])(void *) = {ev_voidpointer, ev_int, ev_double}; 

void bitsetting(int type, int size, char *c){
    char *i = c + size;

    for(*i = ~0; *i != 0; (*i)--){
        if(size != 0)
            bitsetting(type, size - 1, c);
        else{
            if(evaluate[type]((void *)c) != 0){
                printf("error!");
                exit(1);
            }
        }
    }
}

int main(void){
    char c[8];
    int i;

    for(i = 0; i < T; i++){
        if(typesize[i] > 8)exit(1);
        bitsetting(i, typesize[i] - 1, c);
/*printf("経過時間=%d秒\n", clock()/CLOCKS_PER_SEC);*/
    }
    printf("チェック終了");
    return 0;
}



…と思ったんですが、8バイト幅の型を端から端まで調べると1000年以上かかりそうな勢い…


この投稿にコメントする

削除パスワード

No.4307

Re:if文
投稿者---円零(2005/07/15 13:58:03)


すみません、ちゃんと動作してませんでした。

#include <stdio.h>
#include <stdlib.h>

#define VOIDPOINTER 0
#define INT 1
#define DOUBLE 2
#define T 3

int typesize[T] = {sizeof(void *), sizeof(int), sizeof(double)};

int ev_voidpointer(void *p){
    void **pp = (void **)p;
    return ( (!*pp) - (*pp == 0) );
}

int ev_int(void *p){
    int *pi = (int *)p;
    return ( (!*pi) - (*pi == 0) );
}

int ev_double(void *p){
    double *pd = (double *)p;
    return ( (!*pd) - (*pd == 0) );
}

int (*evaluate[T])(void *) = {ev_voidpointer, ev_int, ev_double}; 

void inspection(int type, unsigned char *c){
    int i;
    if(evaluate[type]((void *)c) != 0){
        printf("error!\n");
        for(i = 0; i < typesize[type]; i++)
            printf("%02x ", c[i]);
        exit(1);
    }
}

void bitsetting(int type, int size, unsigned char *c){
    unsigned char *i = c + size;
    if(size != 0){
        for(*i = ~0; *i != 0; (*i)--)
            bitsetting(type, size - 1, c);
        bitsetting(type, size - 1, c);
    }
    else{
        for(*i = ~0; *i != 0; (*i)--)
            inspection(type, c);
        inspection(type, c);
    }
}

int main(void){
    unsigned char c[8];
    int i;
    for(i = 0; i < T; i++){
        if(typesize[i] > 8)exit(1);
        bitsetting(i, typesize[i] - 1, c);
    }
    printf("チェック終了");
    return 0;
}

これで大丈夫なはず。多分。


この投稿にコメントする

削除パスワード

No.4295

Re:if文
投稿者---NykR(2005/07/14 13:59:18)


>「if( a )とif( (a) != 0 )は同じ」

if文は、条件式が0と比較して等しくないときに本体が実行されます。
ですから、
if( a )
では、aが0と比較して等しくないときに本体が実行され、
if( a != 0 )
では、a != 0 という式が0と比較して等しくないときに本体が実行されます。
でもって、等値演算子!=は左右のオペランドが互いに等しくなければ1を、等しければ0を返します。


>「!aとa==0は同じ」

単項演算子!はオペランドが0と比較して等しければ1を、等しくなければ0を返します。

等値演算子==は左右のオペランドが互いに等しければ1を、等しくなければ0を返します。


仕様で定められているのはそれだけです。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity