C言語関係掲示板

過去ログ

No.361.num -= val < 10; とは

[戻る] [ホームページ]


No.2370

Cで行う比較
投稿者---いち(2002/08/13 18:23:00)


num -= val < 10;

if (val < 10)
num--;

となるのでしょうか。

「num -= val < 10」と記述があった場合、右辺が先に判断される
のですか。なにか決まり、法則でのも。

val < 10 は、valが10より小さいときは真となる判断のためif文
になるんでしたけ。


No.2372

Re:Cで行う比較
投稿者---とおり(2002/08/13 19:21:38)


演算子には優先順位があるのでそのためです。
こちらのHPの「14-5.演算子の優先順位と結合規則」を参考にしてみましょう。

どうして「&,^,|」は「<,==」等より低いんだろう…。
先入観があったおかげで昔大ポカしました。


No.2375

Re:Cで行う比較
投稿者---はじめ(2002/08/14 00:10:04)


とおりさんも書かれていますが、このHPの「14-5.演算子の優先順位と結合
規則」を参考にすれば理解できると思います。

式の演算には、優先順位と結合規則のふたつがあり、優先順位とは、演算子
の優先度です。
掛算、割算、加算が含まれている式があった場合、まず掛算と割算をしてから
その値を加算しますよね。それと同じことをいいます。
結合規則とは、優先順位が同じ場合どちらから演算をするか決めた規則です。
たいていは、左から右に進みます。

簡単な例として、
a=b=c=0 は、0をcに代入し、その結果をbに代入し、その結果をaに代入
4+2-8/4 は、4掛ける2が行われ、次に、8割る4が行われ、最後に引算が
行われる
x=a==b は、aとbを比較し、一致していたならば、xに1が、不一致ならば
0が代入

で、num -= val < 10; でいうと
val < 10 の比較演算が行われ、10より小さい場合は、引算が行われます。

実際、演算をまとめて書くと、見にくいし、バグの作りこみのもとにもなり
ます。
慣れるというか、見やすくするということであるならば、演算子ごと分けた
方が。

if (val < 10)
num--;

で書いた方がいいかと思います。

その他として、
C言語では、論理値を数値(int型)で表しているので、0を偽、0以外を真として
演算をしています。
文字列の終わりを「if (!*str) {・・・・}」と表現できるのもこれがあるからです。
たとえば、
「if (!str) ・・・・;」と「if (str == 0) ・・・・;」は同じことを言っていま。
strが0以外を「!」で否定しているからです。

No.2386

便乗の質問
投稿者---いち(2002/08/14 15:02:16)


>「if (!str) ・・・・;」と「if (str == 0) ・・・・;」は同じことを言っていま。
>strが0以外を「!」で否定しているからです。

if(!a)」と「if(a==0)」が同等と扱われるのは。

No.2387

Re:Cで行う比較への質問
投稿者---いち(2002/08/14 15:03:47)


>「if (!str) ・・・・;」と「if (str == 0) ・・・・;」は同じことを言っていま。
>strが0以外を「!」で否定しているからです。

if(!a)」と「if(a==0)」が同等と扱われるのは。


No.2388

Re:Cで行う比較への質問
投稿者---はじめ(2002/08/14 15:17:01)


>関係演算子の演算結果 真はゼロ以外の値は必ず1なのでしょうか?
>ゼロ以外の値は1という決まりがあるのでしょうか?

>>「if (!str) ・・・・;」と「if (str == 0) ・・・・;」は同じことを言っていま。
>>strが0以外を「!」で否定しているからです。
>
>if(!a)」と「if(a==0)」が同等と扱われるのは。


いいえ、決まりがなかったと思います。
ゼロ以外の値には、負の数、正の数もありますから。

例えば、無限ループを作るとき、
while(1) {
}
とかを使う場合があります。
C言語では、0を偽、0以外を真とみなしていますから、「1」というのは
真になり無限となります。
別に、この値を「2」とか「-1」にしても同じことになります。

「a==0」というのは、aが0ならば真ということです。
「!a」というのは、aの否定を表しており、0以外の値を0にします。
従って、0とみなされているわけですから、偽となります。
aが0だと、本来なら偽を表しますが、「!」で否定となるため、0以外の
値とみます。従って、0以外は真ですから、真となります。

if()は、()の式が真ならばの判定ですから、「if(!a)」と「if(a==0)」は
同等となるわけです。

int a ,b;
int ret ;

printf("a 値は:") ;
scanf("%d",&a) ;

if(a){
printf("真\n") ;
} else {
printf("偽\n") ;
}

printf("b 値は:") ;
scanf("%d",&b) ;

if(!b){
printf("真\n") ;
} else {
printf("偽\n") ;
}

を実行してみてください。
aに0以外の値をいれると「真」と表示されます。
 if(a)にて、0以外は真とみているから
bに0以外の値をいれると「偽」と表示されます。
 if(!a)にて、0以外(真を表す)の否定しているから

また、値が0か0以外をみているので算術式の値であっても実行されるので
注意が必要です。

説明が曖昧で、書いている内容も間違っているかもしれません。
鵜呑みだけはしないで下さい。
間違っていたらここに訪れている優秀な方が訂正して頂けます。


No.2389

Re:Cで行う比較への質問
投稿者---TDa(2002/08/14 17:49:02)


>>関係演算子の演算結果 真はゼロ以外の値は必ず1なのでしょうか?
>>ゼロ以外の値は1という決まりがあるのでしょうか?
中略
>いいえ、決まりがなかったと思います。
>ゼロ以外の値には、負の数、正の数もありますから。
1に決まっています。お持ちであればK&R2ndのA7.4.7論理否定演算子、A7.9関係演算子
A7.10等値演算子をご覧ください。

>C言語では、0を偽、0以外を真とみなしていますから、「1」というのは
>真になり
これ、間違ってはいないのだけれどそのせいで落とし穴にはまっているような気がします。
C言語ではほかの言語にあるような論理型という型がありません。とりあえずこれが前提。

>「a==0」というのは、aが0ならば真ということです。
違います。aが0の時a == 0を評価すると1になります。真にはならない。

>「!a」というのは、aの否定を表しており、0以外の値を0にします。
これもちょっと違う。aが非0の時!aを評価すると0になります。aが0の時!aを評価すると1に
なります。

>if()は、()の式が真ならばの判定ですから、
違いますね。(式)を評価したとき0か非0かです。真偽じゃありません。

>また、値が0か0以外をみているので算術式の値であっても実行されるので
>注意が必要です。
この文を読むとわかっていると思うのですが逆に細かいところで気になる表現がありましたので
つっこませてもらいました。気を悪くなされぬよう。


No.2391

Re:Cで行う比較への質問
投稿者---はじめ(2002/08/14 22:14:21)


全然、認識違いとうか、考え違いというか、解釈があってませんでした。
そのとおりにしていたらとんでもないプログラムになってますね。

改めて再確認ができ自分の見直しにもなりました。
他の人が作成したソースコードで見る機会もありますから役にたつと
思います。


No.2392

便乗ですがC言語につていの本
投稿者---人生(2002/08/14 22:15:52)


ところでK&R2ndとはどのようなC言語の本なのでしょうか。
あまり聞いたことがないのですが。私が無知なだけかも知れませんが。
著者、またや訳者、出版社等を教えてください。
そのたC言語につての本教えてください。
HP等があればお願いします。

ついでといっては何ですが、Visual Basicについてもよい本がありました
お願いします。

No.2393

Re:便乗ですがC言語につていの本
投稿者---TDa(2002/08/14 23:00:19)


>ところでK&R2ndとはどのようなC言語の本なのでしょうか。

通ぶってスラングを使いましてすいません。こちらのような掲示板で断りなしに
使うスラングでは無かったかもしれないですね。あまりにも有名なのですでに持
っているかもしれません。

「プログラミング言語C第2版」ISBN2-320-0269206
カーニハン・リッチー著、石田晴久訳 共立出版社

著者カーニハンとリッチーのイニシャルをとってK&R2ndが通り名です。
入門書としてはどうかと思いますがC言語の本1冊だけあげろといわれれば
この本になるでしょうね。

No.2394

Re:便乗ですがC言語につていの本
投稿者---人生(2002/08/14 23:19:46)


>>ところでK&R2ndとはどのようなC言語の本なのでしょうか。
>
>通ぶってスラングを使いましてすいません。こちらのような掲示板で断りなしに
>使うスラングでは無かったかもしれないですね。あまりにも有名なのですでに持
>っているかもしれません。
>
>「プログラミング言語C第2版」ISBN2-320-0269206
>カーニハン・リッチー著、石田晴久訳 共立出版社
>
>著者カーニハンとリッチーのイニシャルをとってK&R2ndが通り名です。
>入門書としてはどうかと思いますがC言語の本1冊だけあげろといわれれば
>この本になるでしょうね。

たびたびですいません。
入門書とか初心者向けになるとどのような本がよろしいでしょうか。


No.2430

Re:Cで行う比較への質問
投稿者---SF(2002/08/20 12:24:26)


>>「!a」というのは、aの否定を表しており、0以外の値を0にします。
>これもちょっと違う。aが非0の時!aを評価すると0になります。
>aが0の時!aを評価すると1になります。

if文やwhileの()って、()の中身が0以外のとき実行する決まりとなって
いると教えられたのですが、

a=2;
if(a)
は、aが2の時、aを評価したら、非0だったので、「1」となる。
a=0;
if(a)
は、aが0の時、aを評価したら、0だったので「0」となる。

a=2;
if(!a)
は、aが2の時、!aを評価したら、非0を否定するというこなので、
否定の演算は、0->1に、1->0にしているので、
「0」となる。
a=0;
if(!a)
は、aが0の時、!aを評価したら、0を否定するということなので、
否定の演算は、0->1に、1->0にしているので、
「1」となる。

の考えでいいのですか。



No.2431

Re:Cで行う比較への質問
投稿者---TDa(2002/08/20 15:10:16)


>a=2;
>if(a)
>は、aが2の時、aを評価したら、非0だったので、「1」となる。
1にはなりません。a = 2; の後aを評価したら2です。

>a=0;
>if(a)
>は、aが0の時、aを評価したら、0だったので「0」となる。
これもa = 0; の後にaを評価したら0でそこで終わりです。

>a=2;
>if(!a)
>は、aが2の時、!aを評価したら、非0を否定するというこなので、
>否定の演算は、0->1に、1->0にしているので、
>「0」となる。
これはその通り。a = 2;の時に!aを評価すると0になります。念のためaは相変わらず2です。

>a=0;
>if(!a)
>は、aが0の時、!aを評価したら、0を否定するということなので、
>否定の演算は、0->1に、1->0にしているので、
>「1」となる。
これもあっています。

以上のことは次のようなコードで確認できます。どのように表示されるか予想して実際の結果と合わせてみてください。
#include <stdio.h>

int main(void)
{
    int a;
  
    a = 2;
    printf("a : %d, !a : %d, !(!a) : %d\n", a, !a, !(!a));
    a = 0;
    printf("a : %d, !a : %d, !(!a) : %d\n", a, !a, !(!a));
    
    return 0;
}


No.2380

Re:便乗の質問
投稿者---YUZAWA(2002/08/14 10:00:56)


>num -= val < 10;
> ↓
>if (val < 10)
> num--;

この記述どちらも同じ(下のほうが見やすいと思う)ですが、
関係演算子の演算結果 真はゼロ以外の値は必ず1なのでしょうか?
ゼロ以外の値は1という決まりがあるのでしょうか?

No.2381

Re:便乗の質問
投稿者---TDa(2002/08/14 12:29:08)


>関係演算子の演算結果 真はゼロ以外の値は必ず1なのでしょうか?
>ゼロ以外の値は1という決まりがあるのでしょうか?

関係演算子、等値演算子、論理否定演算子(==, !=, <, >, <=, >=, !)は評価した結果 0もしくは1になります。

ただし真は非0であって1ではないので落とし穴にはまらないように。

No.2383

Re:便乗の質問
投稿者---YUZAWA(2002/08/14 13:37:02)



>関係演算子、等値演算子、論理否定演算子(==, !=, <, >, <=, >=, !)は評価した結果 0もしくは1になります。
>
>ただし真は非0であって1ではないので落とし穴にはまらないように。

ありがとうございます。評価した結果では真は1なんですね。
落とし穴にはまらないように真を == 1 で判断しないようにします。

No.2385

Re:便乗の質問
投稿者---TDa(2002/08/14 14:32:55)


>落とし穴にはまらないように真を == 1 で判断しないようにします。

OK。それがわかっているなら大丈夫。