アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語では0をif文などで判定するときに

負の値になったら・・・という問題のときに

0は負の値に入るんでしょうか?

それとも単純に-1とやるべきなのでしょうか

コンパイルするとif(a<0)などでは0はもちろん含まないのですが

-1にすると負の値として扱っているように見えるのですが、実際のところどうなんでしょうか

もし負の値を入力されたら、というときに-1でいいのか0なのか。

ご回答お待ちしております

A 回答 (10件)

#7 です。



禅問答みたいなので最後にしますが、以下について、

>>> もし負の値を入力されたら、というときに-1でいいのか0なのか。
>>0 をどちらに含めるかです。

これはちょっと誤解を招く表現でした。失礼しました。

たとえば、
if ( a > 0 ) { (真) printf("a は正の数です."); }else { (偽) printf("a は負の数です."); }
というのは厳密には間違いで、
if ( a > 0 ) { (真) printf("a は正の数です."); } else { (偽) printf("a は 0 か負の数です."); }
が正しい。

ここで、正の数のときは真、負の数は偽になるが、0 は偽になるから負に含まれているようにみえるという、条件の真偽と、数の正負の区別ができていないことが疑問の発端のようにみえたので、このような表現をしました。

>>> -1にすると負の値として扱っているように見えるのですが、実際のところどうなんでしょうか
>>扱っていません。
>>a = 0 のとき、 ( a < -1 ) は 偽です。
>ということはif(a < -1){正} else { 偽 } の場合
>偽のほうにいくということでしょうか?

は、

> if ( a < -1 ) { (1) } else { (2) }
> であるときは、
> 実際のところ、(2)を通ります。

と書いたとおりです。

「負の値を入力した場合、という条件」の正解についてご執心のようですが、

>むむ、ということはif(a<=0)かif(a>=0)にすると負の値を入力した場合、という

誤解を招いて申し訳なかったですが、両方なりません。
前者は a が 0 以下(a が 負と 0 )のとき真で、後者は、a が 0以上(a が 正 と 0 )のとき真、という条件で、0 が入ってしまっているので、もはや、正負とかの問題じゃなくなってしまう。
負の値は、0 より小さい数。これは定義だから、「負の値を入力した場合、という条件」は ( a < 0 ) で 正解です。


で。
この定義とプログラムの挙動のつじつまがあわないのであれば、if の条件よりも、その前後のコードや、実装の方法に問題があるんじゃないかと思います。だから、

> -1にすると負の値として扱っているように見えるのですが、

という疑問に至ったコードを示してもらえれば、エキスパートのみなさんも答えやすいと思いますよ。:-)
 
 

この回答への補足

一応No.9さんをベストアンサーにしておきたいと思いますが
エキスパートの人用にコードを書いておきます
昔のファイルから引っこ抜いてきたので間違ってるかもしれません・・・

****問題****

main()関数で10個のintの要素を持つ配列xを宣言する。
x[9]には-1を入れておく。

配列xにはforループを用いて、scanfで最大9個の値を読み込む。
(すなわちx[9]には決して値を入れない。)
ただし、負の値が入力されたら、その値(負の値)を
配列xに入れて、ループを終了し、関数kosuu()を呼ぶ。

関数kosuu()には引数としてxを渡す。

関数kosuu()は、与えられた配列に負の値が現れるまでに、何個
の要素があったかを返す関数である。
たとえば、3 4 1 -1であれば、3個あるとしてとして3を返す。

main()関数では、関数kosuu()から返された値を画面に出力する。

#include <stdio.h>
int kosuu(int []);
int
main()
{
int x[10],a;

x[9] = -1;

for(a=0;a<9;a++){
scanf("%d",&x[a]);
if(x[a]<-1){
x[0]=x[a];
break;
}
}
kosuu(x);
return 0;
}
int
kosuu(int x[])
{
int b=0;
int c;
for(c=0;c<9;c++){
}
if(x[c]>0){
b = b+1;
}
printf("%d\n",b);
return b;
}

補足日時:2012/06/13 03:54
    • good
    • 1

その, #9 への補足に書いてあるプログラムがどうかしたんですか?

    • good
    • 0

現在のプロセッサにおいて0というのは特別な数字です。



1. 0かどうかの判定は1インストラクションで実行できる。
2. 0はイミディエイト値をロードする必要がない。

そのため
0とそれ以外の数値の判定においては
0と比較するほうが、資源(実行時間とメモリ)の消費が小さいのです。

従って、整数の正負の判定は
0と比較するのが最も合理的なのです。

if (a <= -1)

if (a < 0)
よりも実行速度が遅くなることはあっても
高速で実行される事は決してないからです。

同様の理由で、単純なループカウンタは
if (i = 0 ; i < 10; i++)
よりも
if (i = 10; i > 0; i--)
の方が優れています。
    • good
    • 0

こんばんは。



C の if で 変数 a を評価するとき、
a = 0 で、

if ( a < 0 ) { (1) } else { (2) }

なら(1)を通るとわかるが、

if ( a < -1 ) { (1) } else { (2) }

であるときは、

> -1にすると負の値として扱っているように見えるのですが、

(1)を通っているようにみえるのですが、

> 実際のところどうなんでしょうか

実際のところ、(2)を通ります。

じっさいに

( 0 < -1 )

は、真か偽かと言われると偽ですよね。

> もし負の値を入力されたら、というときに-1でいいのか0なのか。

もし、

if ( a < 0 ) { (1) } else { (2) }

のとき、a が 負なら、(1)で、a が正なら (2)。
このとき、 a = 0 なら、a は 0 より小さくないので、(2)。

しかし、a = 0 のときに (1) に通したいなら、
if ( a <= 0 ) { (1) } else { (2) }

にしてください。

よって、

> -1にすると負の値として扱っているように見えるのですが、実際のところどうなんでしょうか

扱っていません。
a = 0 のとき、 ( a < -1 ) は 偽です。

> もし負の値を入力されたら、というときに-1でいいのか0なのか。

0 をどちらに含めるかです。


# ちょっと違うけど、and とか or が含まれるif の条件の話を後輩に ベン図を用いて説明したら、ベン図ってなんですか、といわれたから、数直線にしたら、「すごくわかりやすいです。」と言ったのを思い出しました。ベン図は高校生の数学。数直線は小学校の算数ぅぅぅ。
 

この回答への補足

わかりやすい説明ありがとうございます

>> -1にすると負の値として扱っているように見えるのですが、実際のところどうなんでしょうか

>扱っていません。
>a = 0 のとき、 ( a < -1 ) は 偽です。
ということはif(a < -1){正} else { 偽 } の場合
偽のほうにいくということでしょうか?

>> もし負の値を入力されたら、というときに-1でいいのか0なのか。

>0 をどちらに含めるかです。

むむ、ということはif(a<=0)かif(a>=0)にすると負の値を入力した場合、という条件になるのでしょうか。

ベン図は初めて僕も聞きました。
数直線は聞いたことなかったです・・・
y=axみたいな線でしょうか?
ベン図をネットで調べたらOSの絵みたいですね(あくまで感想)
ブロック図やフローチャートとはべつ のものですか?

補足日時:2012/06/09 01:42
    • good
    • 0

> if(a(1や2)<0)の場合0は負で


> if(a=>0)でやると+の値で判定される ...
> まあ=>0だと0が負と判定されることはない ...

0は正の数でも負の数でもなく、これは変わりません。「a<0」でも「a=>0」でも他のどんな比較でも、0は正にも負にもなりません(C言語の整数なら)。上は0ではなく、aの値によって結果が変わります。

つまり、

> C言語では0をif文などで判定するときに
> 負の値になったら・・・という問題のときに

については、内容を読み取れていないか、問題そのものが間違っていると思います。問題は「aをif文などで判定する」のではないでしょうか?

この回答への補足

>問題は「aをif文などで判定する」のではないでしょうか?

もちろんそのとおりです
あー、そうか、というとうまく内容が読み取れてないのかな・・・
例でいうと
たとえばwhile(1)などで無限ループを作った際に
負の値が入った場合にbreakする、などという作業なのですが

補足日時:2012/06/09 01:29
    • good
    • 0

>ということは


>a<0
>a<=-1
>a<-1(?)
>は同じということでしょうか

同じではない。
「未満」と「以下」の区別がついていないようです。(小学校で習ったと思いますが?)

aが-1の場合
a < 0   真(True)
a <= -1  真(True)
a < -1  偽(False)
となります。
    • good
    • 0

数直線を書いてみて下さい。


-1と0の間にも、負の数は無数に存在するでしょう?

この回答への補足

そうなんです。だから負の値で困ってます・・・ごめんなさい

補足日時:2012/06/09 01:26
    • good
    • 0

> 0は負の値に入るんでしょうか?


整数は「正の値」「0」「負の値」に分類できます。
負の値が0を含むことはありません。

> コンパイルするとif(a<0)などでは0はもちろん含まないのですが
> -1にすると負の値として扱っているように見えるのですが、実際のところどうなんでしょうか
「何を」-1にしたのですか。


ちなみに,整数の範囲において,
・0より小さい
・-1以下
・負の値
は全て同じことを意味します。

この回答への補足

わかりやすい解説ありがとうございます

>「何を」-1にしたのですか。
if(a<0)をif(a<-1)ということです

>ちなみに,整数の範囲において,
>・0より小さい
>・-1以下
>・負の値
>は全て同じことを意味します。

ということは
a<0
a<=-1
a<-1(?)
は同じということでしょうか

補足日時:2012/06/08 18:23
    • good
    • 0
この回答へのお礼

>ちなみに,整数の範囲において,
>・0より小さい
>・-1以下
>・負の値
>は全て同じことを意味します。

この部分とても参考になりました。
補足で説明しましたのでまたご意見あればお願いします

お礼日時:2012/06/08 18:24

コンピュータでは最上位ビットが正負を表します、8ビットならビット7=1にて負の数です


2進数で 11111111= -1 00000000= 0 を表しますので
<0にて負数 =>0ならば正数です
    • good
    • 0
この回答へのお礼

なるほど。となると
if(a(1や2)<0)の場合0は負で
if(a=>0)でやると+の値で判定されるということでよろしいのでしょうか。まあ=>0だと0が負と判定されることはないでしょうが・・・
ご参考ありがとうございます

お礼日時:2012/06/08 18:23

それはC言語の問題ではなく日本語の問題ですね。


さんすうからやりなおしだ。
    • good
    • 0
この回答へのお礼

そうですねwしかし算数からとなると、本屋でチラ見ですかねw

お礼日時:2012/06/08 18:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!