• ベストアンサー

C言語では0は・・・

C言語では0をif文などで判定するときに 負の値になったら・・・という問題のときに 0は負の値に入るんでしょうか? それとも単純に-1とやるべきなのでしょうか コンパイルするとif(a<0)などでは0はもちろん含まないのですが -1にすると負の値として扱っているように見えるのですが、実際のところどうなんでしょうか もし負の値を入力されたら、というときに-1でいいのか0なのか。 ご回答お待ちしております

質問者が選んだベストアンサー

  • ベストアンサー
回答No.9

#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にすると負の値として扱っているように見えるのですが、 という疑問に至ったコードを示してもらえれば、エキスパートのみなさんも答えやすいと思いますよ。:-)    

izupawapuro
質問者

補足

一応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; }

その他の回答 (9)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.10

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

回答No.8

現在のプロセッサにおいて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--) の方が優れています。

回答No.7

こんばんは。 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 の条件の話を後輩に ベン図を用いて説明したら、ベン図ってなんですか、といわれたから、数直線にしたら、「すごくわかりやすいです。」と言ったのを思い出しました。ベン図は高校生の数学。数直線は小学校の算数ぅぅぅ。  

izupawapuro
質問者

補足

わかりやすい説明ありがとうございます >> -1にすると負の値として扱っているように見えるのですが、実際のところどうなんでしょうか >扱っていません。 >a = 0 のとき、 ( a < -1 ) は 偽です。 ということはif(a < -1){正} else { 偽 } の場合 偽のほうにいくということでしょうか? >> もし負の値を入力されたら、というときに-1でいいのか0なのか。 >0 をどちらに含めるかです。 むむ、ということはif(a<=0)かif(a>=0)にすると負の値を入力した場合、という条件になるのでしょうか。 ベン図は初めて僕も聞きました。 数直線は聞いたことなかったです・・・ y=axみたいな線でしょうか? ベン図をネットで調べたらOSの絵みたいですね(あくまで感想) ブロック図やフローチャートとはべつ のものですか?

noname#208507
noname#208507
回答No.6

> 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文などで判定する」のではないでしょうか?

izupawapuro
質問者

補足

>問題は「aをif文などで判定する」のではないでしょうか? もちろんそのとおりです あー、そうか、というとうまく内容が読み取れてないのかな・・・ 例でいうと たとえばwhile(1)などで無限ループを作った際に 負の値が入った場合にbreakする、などという作業なのですが

回答No.5

>ということは >a<0 >a<=-1 >a<-1(?) >は同じということでしょうか 同じではない。 「未満」と「以下」の区別がついていないようです。(小学校で習ったと思いますが?) aが-1の場合 a < 0   真(True) a <= -1  真(True) a < -1  偽(False) となります。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.4

数直線を書いてみて下さい。 -1と0の間にも、負の数は無数に存在するでしょう?

izupawapuro
質問者

補足

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

回答No.3

> 0は負の値に入るんでしょうか? 整数は「正の値」「0」「負の値」に分類できます。 負の値が0を含むことはありません。 > コンパイルするとif(a<0)などでは0はもちろん含まないのですが > -1にすると負の値として扱っているように見えるのですが、実際のところどうなんでしょうか 「何を」-1にしたのですか。 ちなみに,整数の範囲において, ・0より小さい ・-1以下 ・負の値 は全て同じことを意味します。

izupawapuro
質問者

お礼

>ちなみに,整数の範囲において, >・0より小さい >・-1以下 >・負の値 >は全て同じことを意味します。 この部分とても参考になりました。 補足で説明しましたのでまたご意見あればお願いします

izupawapuro
質問者

補足

わかりやすい解説ありがとうございます >「何を」-1にしたのですか。 if(a<0)をif(a<-1)ということです >ちなみに,整数の範囲において, >・0より小さい >・-1以下 >・負の値 >は全て同じことを意味します。 ということは a<0 a<=-1 a<-1(?) は同じということでしょうか

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.2

コンピュータでは最上位ビットが正負を表します、8ビットならビット7=1にて負の数です 2進数で 11111111= -1 00000000= 0 を表しますので <0にて負数 =>0ならば正数です

izupawapuro
質問者

お礼

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

回答No.1

それはC言語の問題ではなく日本語の問題ですね。 さんすうからやりなおしだ。

izupawapuro
質問者

お礼

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

関連するQ&A