XC8 if文の条件式にビット反転が使えない

なぜか、if文の判定式内で、変数aと変数bの補数(ビット反転)したものの比較が作動しません。

●if文内のビット反転変数との比較

// うまく働かない
if(a == ~b) {...

// OK
c = ~b;
if(a == c) {...

“a”, “b”,”c” はunsigned char型の変数です。一旦、他の変数へビット反転したものを代入し、その変数と比較すれば、ちゃんと動きます。なぜでしょう。これがうまく動かなくて、のべ半日費やしてしまいました。

演算子の優先順位の問題かな?”if(a == (~b))”とすると動くのかもしれませんが、めんどくさいので試してません。

●switch-case文の式の値をcase文内で++演算子などで更新できない

ついでに、これはほかのCコンパイラでもあったので、仕様的なものかもしれませんが、うまく動くときもあるので、うっかり使ってしまいます。次のような構文はcase文の中でaの値を++演算子で+1していますが、これがうまく更新されないことがあります。

  switch(a) {
    case 1:
      a++;
      break;
    case 2:
      a++;
      break;
    default:
      braek;
  }

こうやればうまく動きます。

  switch(a) {
    case 1:
      a = 2;
      break;
    case 2:
      b = 3;
      break;
    default:
      braek;
  }

定数で代入するしかだめみたいです。昔から他のCコンパイラでも経験しているので、多分、C言語の仕様的なものなんでしょう。

 

コメントは受け付けていません。