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

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

ただいまの
回答率

90.48%

  • C

    3834questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 7,088

onGu

score 10

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/30 22:31

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

    キャンセル

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/30 22:31

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

    キャンセル

+2

JIS X3010には

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/30 22:31

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

    キャンセル

checkベストアンサー

+1

>ピン設定のずばりこの意味を教えて下さい。 
>|= ,&= 
|, &はビット演算子ですね。
|は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 22:55

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

    キャンセル

同じタグがついた質問を見る

  • C

    3834questions

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

閲覧数の多いCの質問