• ベストアンサー

見たことの無い式で解かりません。

教えていただきたいのですが 以下のようなプログラムがあったのですが、 |= が良くわからないのですが、変数bには なにが入るのでしょうか? switch(変数a) { case 定数a: 変数b |= 's'; break; } 申し訳ありませんがよろしくお願いします。

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

論理和複合代入演算子と思われますが、 アルファベットsと変数bの論理和をとるのも、ちょっと妙なので、演算子がオーバロードされてる可能性があります。

参考URL:
http://www.google.com/search?hl=ja&q=%E8%A4%87%E5%90%88%E4%BB%A3%E5%85%A5%E6%BC%94%E7%AE%97%E5%AD%90
psychesine
質問者

お礼

ありがとうございます

その他の回答 (2)

回答No.3

#2さんの回答で概ねいいとは思いますが、 いくらなんでも's'の2進表現が00011110というのはないでしょう。 ごく一般的なasciiなどでは0111 0011ですし、仮にメインフレームに見られるEBCDICだとしても、1110 0010ですから。 それはさておき、質問者はCの文法くらいいつでも調べられるようにすべきですね。 例えば演算子の優先順位表でも見れば、必ず出てくる演算子なのですから。 #寧ろ載せてこないのは低俗な初心者本くらい。

  • talepanda
  • ベストアンサー率58% (45/77)
回答No.2

ビット和の複合代入です。 's'の2進表現は 00011110 なので 例えば、bの2進表現が 10010010 なら bに 10011110 が代入されるということです。

psychesine
質問者

お礼

ありがとうございます

関連するQ&A

  • switch文caseについて

    switchのcaseについてですが、数字を直接記述せずに、const変数に値を代入して使用出来ますか? 例) const int A = 1; const int B = 2; switch(suuti){ case A: 処理; break; case B: 処理; break; } コンパイルすると、「case 式は、整数型定数でなければなりません。」と出てきてしまうのですが、直接数値を記述しないといけないのでしょうか? よろしくお願いします。

  • switch の範囲指定

    switch文で以下のように書いた時に処理はCを実行するのですが、 変数a が 0~9の時に こうしますよ と範囲がまだ狭い時はこのように書いても処理はできると思いますが 変数a の範囲が 0~99だった場合、いちいちcase を100回書いて(defaultを使えば処理は減るだろうけど) と数字を100回書かないといけないのはとても面倒だと思うのです。 そこで以下のようにifを使わずにswitchを使って範囲を指定する方法はありませんか? //ifを使った場合の範囲指定 if( ( 0 <= a ) && ( a < 25 ) ){ //略 } else if( ( 25 <= a ) && ( a < 50 ) ){ //略 } else if( ( 50 <= a ) && ( a < 75 ) ){ //略 } else if( ( 75 <= a ) && ( a < 100 ) ){ //略 } //ソース int a = 6; switch( a ){   case 0: case 1:     //処理A     break;   case 2: case 3: case 4:     //処理B     break;   case 5: case 6:     //処理C     break;   case 7: case 8: case 9:     //処理D     break; }

  • switch文について

    独学でjavaの勉強をしているのですが、switch文が本のとおりに入力しても エラーがでて困っています。どこが間違っているのかわかりません。 ちなみにプログラム内容は class bunki2{ public static void main(String args[]){ int a; a=1; switch (a) { case1:System.out.println("変数aの値は1です。"); break; case2:System.out.println("変数aの値は2です。"); break; case3:System.out.println("変数aの値は3です。"); break; } } } です。 これでコンパイルしようとすると’case’、’default’、または’}’がありません。とでます。 なぜできないのか教えてください。

    • ベストアンサー
    • Java
  • break後も変数を維持するには、どうすればいいで

    break後も変数を維持するには、どうすればいいでしょうか? switch文とかで、breakした後も、変数へ格納した値を利用するには、どうすればいいのでしょうか? switch($hoge) {  case 0:   $a=24;   break;  case 1:   echo $a;//ここで、24と表示させたい   break; static変数とかを使うのでしょうか?

    • ベストアンサー
    • PHP
  • switch で疑問。java超初心者です。

    まず、 public class P1{   public static void main(String[] args){     int n = 1;       switch(n){         case 0:           System.out.println("あ");           break;         case 1:           System.out.println("い");           break;         case 2:           System.out.println("う");           break;         default:           System.out.println("え");       }   } } は、当然「い」と表示されますよね。 default: をcase 3:にしても、問題なく「い」と表示されました。 そこで、こんな風にしてみました。 public class P3{   public static void main(String[] args){     int n = 1;     String s;       switch(n){         case 0:           s="あ";           break;         case 1:           s="い";           break;         case 2:           s="う";           break;         default:           s="え";       }       System.out.println(s);   } } これは「い」と表示されましたが、 default: をcase 3:にすると、エラーとなってしまいます。なぜでしょう。 ちなみに、エラーの内容は 変数 s は初期化されていない可能性があります。     System.out.print(s);                ^ というものでした。 そこで、 変数 s を初期化してみようと、次のように変数 s の宣言の後に null を代入しました。 String s=null; すると、「い」と表示され、エラーは出ません。 なぜ、このようになるのでしょうか。 String型の変数を使っていて、今まではこのようなエラーは出た事が無かったのですが、 どうやらswitch文の中では、初期化しろ、と出てくるようです。 わかり易い解説をいただければと思います。 これは仕様だということで、この通り受け入れるしかないのでしょうか。 勉強していて、少々腑に落ちないので、質問致しました。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • switch文で文字を比較することは出来ませんか?

    switch文で文字を比較することは出来ませんか? 例えば… int main(void){ char buf[5]; buf = 'b'; switch(buf){ case 'a': ・  ・  ・  break; case 'b': ・  ・  ・  break; }

  • このプログラムを見てください(C言語) m( _ _ )m

    現在乱数を使ったプログラムを作っています。 下のプログラムでコンパイルではエラーがでませんが、実行するとデバッグエラーが出てきます。コンパイラにはbccを使っています。恐らく原因は別の関数でbに値を代入してそれをaに代入しているからだろうと思いますが、なぜこれがいけないのかが分かりません。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> int ran, a=1, b, c; void test(void){ b=8; } void main(){ srand(time(NULL)); a=b;//ここを無くすとなぜかエラーが出ない。 while(1){ ran=rand()%(a*2)+1; switch(ran){ case 1: c=1; break; case 2: c=1; break; case 3: c=1; break; case 4: c=2; break; case 5: c=2; break; case 6: c=3; break; case 7: c=3; break; case 8: c=4; break; } printf("%d",c);printf("何か押してください\n");getch(); } }

  • C言語での数字の花形表示

    数字を読み込んで、それを花形を使った文字で表示するプログラムを書いたのですが、自分の書いたプログラムだと、読み込む数字の最初、または最後に0がくるとそれは表示してくれません・・・。 tmp-=top*s2としているから当たり前っちゃあ当たり前なんですが・・・。 そこでこのプログラムをどのように変更したら最初と最後に0を含んでいても表示できるようになるでしょうか?? やはり根本から作り直さなければいけないんでしょうか・・・。 /* 読み込んだ整数を*で表示 */ #include<stdio.h> int main(void) { int no; int dig = 0; int top, tmp, i; int s=1, s2; printf("整数を入力してください:"); scanf("%d", &no); tmp = no; while (tmp > 0) { /* noの桁数を求める */ tmp /= 10; dig++; } for (i = 0; i < (dig-1); i++) s *= 10; tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" ****"); break; case 1 : printf(" *"); break; case 2 : printf(" ****"); break; case 3 : printf(" ****"); break; case 4 : printf(" ** "); break; case 5 : printf(" ****"); break; case 6 : printf(" ****"); break; case 7 : printf(" ****"); break; case 8 : printf(" ****"); break; case 9 : printf(" ****"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" * *"); break; case 1 : printf(" *"); break; case 2 : printf(" *"); break; case 3 : printf(" *"); break; case 4 : printf(" * * "); break; case 5 : printf(" * "); break; case 6 : printf(" * "); break; case 7 : printf(" * *"); break; case 8 : printf(" * *"); break; case 9 : printf(" * *"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" * *"); break; case 1 : printf(" *"); break; case 2 : printf(" ****"); break; case 3 : printf(" ****"); break; case 4 : printf(" ****"); break; case 5 : printf(" ****"); break; case 6 : printf(" ****"); break; case 7 : printf(" *"); break; case 8 : printf(" ****"); break; case 9 : printf(" ****"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" * *"); break; case 1 : printf(" *"); break; case 2 : printf(" * "); break; case 3 : printf(" *"); break; case 4 : printf(" * "); break; case 5 : printf(" *"); break; case 6 : printf(" * *"); break; case 7 : printf(" *"); break; case 8 : printf(" * *"); break; case 9 : printf(" *"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); tmp = no; s2 = s; do { top = tmp / s2; /* tmpの一番上の桁の数字をtopへ */ switch (top) { case 0 : printf(" ****"); break; case 1 : printf(" *"); break; case 2 : printf(" ****"); break; case 3 : printf(" ****"); break; case 4 : printf(" * "); break; case 5 : printf(" ****"); break; case 6 : printf(" ****"); break; case 7 : printf(" *"); break; case 8 : printf(" ****"); break; case 9 : printf(" ****"); break; } tmp -= top * s2; s2 /= 10; } while (tmp > 0); putchar('\n'); return(0); }

  • 関数をまとめる

    関数をつくるときにどうまとめれば良いのでしょうか? 例えば下のようなプログラムがあったとします. #include<iostream> int add(int, int); int multi(int, int); int main(void) {    int a = 4;    int b = 3;    std::cout << add(a, b) << std::endl;    std::cout << multi(a, b) << std::endl; } int add(int a, int b) {    return a + b; } int multi(int a, int b) {    return a * b; } add関数は足し算の結果,multi関数は掛け算の結果を返します. やっている内容はかわらずわざわざ2つに分ける必要があるか?と思ってしまいます. 要は, int arithmetic_operations(int a, int b, int pattern) {    int result;    switch(pattern) {       case 1:          result = a + b;          break;       case 2:          result = a - b;          break;       case 3:          result = a * b;          break;       case 4:          if(0 == b) {             exit(1);          }          result = a / b;          break;       default:          break;    }    return result; } このような関数を用意してpattern変数で計算を制御するほうがまとまりがあると思います.ですが,いちいち中身を確認しながらプログラムを書く必要があるので可読性は低くなります. どちらがベターでしょうか?

  • 条件分岐 if(elseif) switchの実行速度

    条件分岐に if switchがありますが、 ifパターン ============================== if ( $a = 1) {   処理A } elseif ($a = 2) {   処理B } ============================== switchパターン ============================== switch($a){ case '1':   処理A break; case '2':   処理B break; } ============================== 実際はもっと複雑ですが、どちらのほうが実行速度が速いのでしょうか。

    • ベストアンサー
    • PHP

専門家に質問してみよう