• ベストアンサー

ifについて

C言語を最近学び始めました。 以下をコンパイルし、実行しても予期せぬ結果になってしまい、困っています。 #include <stdio.h> #include <time.h> #include <stdlib.h> void retry(int); int main(void); int main(void) { int x,y,yn; srand(time(NULL)); x = rand()%6 +1; //Player y = rand()%6 +1; //CPU printf("Player:%d\n",x); printf("CPU:%d\n",y); if(y<<x){printf("Player > CPU\n");} else if(x<<y){printf("Player < CPU\n");} else {printf("Player = CPU\n");} retry(yn); return 0; } void retry(int yn) { printf("\nRetry ?(Yes=1/No=0)>"); scanf("%d",&yn); if (yn==1){printf("\n\n");getchar();main ();} else if(yn==0){printf("\n\nend");exit(0);} else {retry(yn);}; } サイコロを2人が振り、目が大きいほうが勝ちというものなのですが、 「Player:3 CPU:6 Plyaer>CPU」 といった具合にx,yの値に関わらず「Plyaer>CPU」と表示されます。 何が原因なのでしょうか。 よろしくお願いします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

比較演算子なら > または < です 重ねて >> または << としてしまうと シフト演算子になってしまいます したがって x >> y としてしまうと xをyビット右シフトすることになり この演算結果が 0になら無い限り else節は実行されません xが4 yが2の場合なら else説が実行されるでしょう

yata16
質問者

お礼

勘違いしていました。ありがとうございます。

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

大小関係の代わりにシフト演算子が使われているから。

yata16
質問者

お礼

勘違いをしていました。ありがとうございます。

関連するQ&A

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

  • 線形補間

    線形補間での求め方 問題文: 1.数値を読み込む 2.xを読み込む 3.x<x1 または x>xnならエラー 3.x1<x<i+1 となるiを見つける 4.補間公式でyを求める 5.結果をプリントする #include<stdio.h> float hokan(void); int xn[] = {0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75}; double yn[] = {0.000,0.087,0.173,0.258,0.342,0.422,0.500,0.573, 0.624,0.707,0.766,0.819,0.866,0.906,0.939,0.965}; int x=5; void main() { printf("y = %lf\n", hokan()); } float hokan(void) { int i; double y; if(x <0|| 75<= x){ printf("エラーです\n"); } else{ for(i=0; xn[i] < x; i++) y = (yn[i+1] - yn[i]) * (x - xn[i]) / (xn[i+1] - xn[i]) + yn[i]; return y; } } 数表を最初にxnとynで表記しています。 このプログラムで線形補間が行われてないそうなのですが・・ 何か誤りがある様でしたらどなたか教えてください。

  • 再帰呼び出し

    アッカーマン関数の値を出力するプログラム #include void main(void); int ack(int,int); void main(void) { int x,y,i; printf(" data(x) = "); scanf("%d",&x); printf(" data(y) = "); scanf("%d",&y); i = ack(x,y); printf("Ackerman = %d\n",i); } int ack(int a,int b) { int k; if (a == 0) k = b+1; else if (b == 0) k = ack(a-1,1); else k = ack(a-1,ack(a,b-1)); return (k); } この関数を呼び出した回数も出力するようにしたいのですが、どうしたらいいのでしょうか?

  • C言語のIF関数のアドバイスお願いします。

    #include <stdio.h> int main(){ int x,i,div=0; printf("x="); scanf("%d",&x); for(i=1;i<=x;i++){ if(x%i == 0){ div++; } } if(ここがわかりません) printf("%dは素数です\n",x); else printf("%dは素数でありません\n",x); return 0; }

  • このプログラミングで。

    #include <stdio.h> int main(void) { int x; printf("長い河はどれ?\n 1天の川 2三途の川 3谷川\n"); scanf("%d",&x); if(x == 1){ printf("なるほど"); } else if(x == 2){ printf("フーン"); } else if(x == 3){ printf("やっぱり?"); } else if(x != 1){ printf("ハァ?"); } else if(x != 2){ printf("ハァ?"); } else if(x != 3){ printf("ハァ?"); } return 0; } これを実行して 等しくないときハァ?と表示させて、ふたたび、入力をさせる方法を教えてください。何度でも入力を求める方法もありましたら教えていただきたいです。 とても理解に苦しむような質問ですがよろしくおねがいします。

  • プログラミング

    ランダムの数値を入力してその数値より大きければ正解より大きいと表示して小さければ小さいと表示し正解なら正解ともだすプログラムをつくっています 正解まで何回かかったかとも表示したいと思います 上手く実行できないのでご教授ください #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ int i,x,y; srand((unsigned int)time(NULL)); printf("%\n",i); i=rand()%100; //0以上100以下の整数を生成 y=0; printf("1以上100以下の整数を入力してください。\n"); scanf( "%d", &x ); /* 数値を入力させる */ printf("1以上100以下の整数を入力してください。\n"); y=y+1; if( x == i ) { printf("%d回目で当たりました。\n",y); printf("%d回目で当たりました。\n",y); break; /* 無限ループ */ } else{ if ( x < i ) //printf("正解より大きいです。\n"); printf("正解より大きいです。\n"); else //printf("正解より小さいです。\n"); printf("正解より小さいです。\n"); } } //return0;

  • c言語のフローチャートについての質問です

    #include <stdio.h> int main (void) { int n; for (n=1900; n<2000; n++) { if (n%4==0 && n%100!=10) printf ("%d",n); else if(n%400==0) printf ("%d",n); } printf("\n"); return 0; } をどなたかフローチャートに直してください JIS規格のものでお願いします

  • C言語について

    次のような問題です。 問 自然数nを入力し、nを3で割って割り切れるかどうかを判定し結果を表示する。「割り切れる」、「1余る」、「「2余る」のいずれかが入るものとする。 このようなものをつくりました。 #include<stdio.h> int main(void) { int n; printf("自然数:"); scanf("%d",&n); if(n==0){ printf("割り切れる\n"); }else if(n==1){ printf("1余る\n"); }else{ printf("2余る"); } return(0); } これで合っているかよろしくお願いします。

  • ファイル分割について

    今本をみながら練習中なのですが、ファイル分割がうまくいきません。以下のような3つのプログラムをかいたのですが実行できません。 (一つ目:myfunc.h) int max(int x,int y); (二つ目:myfunc.c) int max(int x,int y){ if(x > y) return x; else return y;} (三つ目:sample.c) #include <stdio.h> #include "myfunc.h" int main(void){ int x,y,c; printf("1番目の整数\n"); scanf("%d",&x); printf("2番目の整数\n"); scanf("%d",&y); c = max(x,y); printf("最大値は%d\n",c); return 0;} すべてコンパイルしてsample.cを実行してもだめでした。ご指導お願いします><

  • C言語 座標軸の設定

    こんにちわ。私は最近プログラミングを学び始めた女学生です。 環境はVisual Studio 2008で、C++を使っています。 今回、課題として座標軸を-と|でつくり、その上にxの3乗-9xのグラフをあらわすというものが出ました。 おおよそわかったのですが、なぜかx軸を形成する軸(-)がこのプログラムだとひとつおきに表示されてしまい、軸として成立しません。なぜなのでしょうか。熟練者の方々、ご指導ご鞭撻のほど、よろしくお願いいたします。 #include<stdio.h> main(void){ int a[40][60],x,y; for(x=0;x<40;x++){ for(y=0;y<60;y++){ a[x][y]=0; if (x==20){ printf ("-");} else if (y==30) { printf ("|"); } if(y==(x-20)*(x-20)*(x-20)-9*(x-20)+30){ printf("*"); } else {printf(" "); } } printf("\n"); } }