質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

35185閲覧

組み込みc言語|=,&=

onGu

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2016/04/30 11:56

ピン設定のずばりこの意味を教えて下さい。
|= ,&=
自分なりに調べましたが、よくわかりません。
よろしくどうぞ。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

a |= ba = a | b と__aの評価が1回だけであることを除き__全く同一です。
同じく
a &= ba = a & b と__aの評価が1回だけであることを除き__全く同一です。

これらは**複合代入演算子(compound assignment)**と呼ばれる物で、他にも仲間達がいます。下記ページの表が参考になるでしょう。
Assignment operators - cppreference.com
なお、C言語のみではなく、他の言語でも似たような物を持っています(ただし、全てではありませんし、組み合わせも言語によって異なります)。

さて、注意点が2つほどあります。

  • a |= ba = a | b では a の評価回数が異なる(前者が1回に対して、後者は2回)。
    つまり、左辺に副作用がある場合は違う結果になるということです。普通の代入演算子を含め、左辺に副作用がある式(++iとかのこと)を書くことはあまりない(というよりバグの温床になるため避けるべき)ですが、評価の回数については注意が必要です。
  • C++では operator|=()operator&=() といった一つの演算子として扱われ、オーバーロードにより、型によって異なる動きになる場合がある。
    C++はCを拡張した言語のため、Cと同じだと思うと痛い目を見る箇所の一つです。標準で用意されている型については同じになるように実装されていますが、ユーザー定義の型(クラス)の場合はそうである保証はありません。ただ、想定される動作と異なる実装すること自体が良くないクラスの作り方とも言えます。

投稿2016/04/30 12:37

編集2016/04/30 13:18
raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onGu

2016/04/30 13:31

portに代入するのに何に対してnot,and,or,xorなのかわからず悩んでましたが、初期設定のportビットに対しての演算ってことですね。
guest

0

JIS X3010には

意味規則 形式 E1 op= E2 の複合代入は(中略) E1 = E1 op ( E2) と同じ

と書いてあります。つまり、
x |= y は x = x | y と同じ
ということです。

こういう類の疑問は規格書(文法書)を見るのが、早くて正確です

投稿2016/04/30 12:29

nob.

総合スコア711

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onGu

2016/04/30 13:31

portに代入するのに何に対してnot,and,or,xorなのかわからず悩んでましたが、初期設定のportビットに対しての演算ってことですね。
guest

0

複合代入といって、演算と代入を一度で行なってしまいます。たとえば、a &= b;であれば、意味的にはa = a & b;と同じです。

投稿2016/04/30 12:26

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onGu

2016/04/30 13:31

portに代入するのに何に対してnot,and,or,xorなのかわからず悩んでましたが、初期設定のportビットに対しての演算ってことですね。
guest

0

ベストアンサー

ピン設定のずばりこの意味を教えて下さい。
|= ,&=

|, &はビット演算子ですね。
|はOR、&はAND。
ORはどちらかが立っていれば立てる。
ANDは両方が立っていれば立てる。

|=とかなってるのは、+=とかと同じで、
a |= b ならば、a = a | b と同義です。

a=1010, b=0000として
a = a & b をするとaは必ず0000になるので、ピン設定がクリアできます。
a=1010, b=0001として
a = a | b をすると1011が返ってきます。つまり値が合成できてますね。

if((a & b) != 0) とかすれば、そのビットが立っているか
確認できます。

ビット演算子を使うとメモリは節約できてよいですけど
個人的に可読性が低いので嫌いです。

投稿2016/05/03 06:46

編集2016/05/03 06:48
otaks

総合スコア223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

onGu

2016/05/03 13:55

マイコンmsp430なんですが、ポートの設定等に使う場合と、ポートのビットをいじる場合に動作が違うみたいで苦労してます。定義されてるんで仕様書みろってことでしょうが・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問