目次
代入演算子: = += -= /= %= >>= <<= |= &=
単項演算子: ! - + & sizeof ~ -- ++ * . (型)
添字参照、関数呼び出し、構造体メンバー演算子: [ ] () . ->
まず、演算子と言えば、算術演算子、代入演算子、関係演算子、単項演算子などの一連の演算子があります。 次に、さまざまな演算子について簡単に理解して、独自の演算子を与えます。理解して注意すべき点を理解したら、学習を始めましょう。
算術演算子: + - * / %
算術演算子は上記の5種類で、誰もが目にしたことのあるものがほとんどですが、特に数学の✖や➗ではなく、乗算(*)と除算(/)に注意してください。次に、剰余(%)があります。この記号は、結果の剰余を取ることを意味します。たとえば、7/3=2 で剰余が 1 の場合、7%3 は 1 に等しくなります。理解できますか?これは、算術演算子の内容。
シフト演算子: >> <<
シフト演算子には >> と << が含まれます。>> は右シフト演算子、<< は左シフト演算子です。すべての情報はバイナリ ビットに格納されるため、ここでの左シフトと右シフトの両方がバイナリ ビットの移動を指すことに注意してください。バイナリ形式。
2 進数とは、32 個の 0 または 1 からなる数字の列を指します。たとえば、a=3: 00000000...00000011 の場合、演算プロセスは次のようになります。 1*2^1+1*2^0=3 ( ^ はパワー数
a<<1 の場合、00000000...00000110 となり、結果は 1*2^2+1*2^1=6 となります。
a>>1 の場合、00000000...00000001 となり、結果は 1*2^0=1 となります。
これはシフト演算子です。
ビット演算子: & | ^
このうち、& はビット単位の AND、| はビット単位の OR、^ はビット単位の XOR、これら 3 つは二項演算子でもあり、具体的な使い方を説明します。
&: x と y の両方が 1 の場合は 1 を取得します。x と y のいずれかが 0、または両方が 0 の場合は 0 を取得します。以下のように省略します。両方とも 1、その後1
|: x または y が 1、または両方が 1 の場合は 1 が取得され、x と y の両方が 0 の場合は 0 が取得されます。1 は 1 と省略されます。
^: x または y の値が異なる場合は 1 を取得し、2 つの値が同じ場合は 0 を取得します。以下のように略します: 同じは 0、異なるビットは 1
違いが明確にわかるように例を示します。
int a=6 0....00110 int b=11 0....01011 a&b 0....00010 a|b 0....01111 a^b 0....01101
代入演算子: = += -= /= %= >>= <<= |= &=
非常に多くの代入演算子があり、上記はそれらのほんの一部であることがわかります。= は誰もが知っていますが、+=、-= などの記号はこれまで見たことがなく、実際には非常に複雑です。単純。
a+=2 はa=a+2を意味します
b-=3 はb=b-3を意味します
等々...
特に、ここでの = は代入演算子であり、次の関係演算子で == と混同される可能性があることに注意してください。これについては、次の関係演算子で詳しく説明します。
単項演算子: ! - + & sizeof ~ -- ++ * . (型)
単項演算子と言えば、その名前が示すように、オペランドが 1 つだけある演算子であり、それに対応するのが双眼演算子、つまり 2 つのオペランドを持つ演算子です。たとえば、a++, ++ は単項演算子です; a+ b, +は両眼オペレータであり、各オペレータの機能については次に詳しく説明しますので、よく理解してください。
まず概念があります。C 言語では 0 は false を意味し、0 以外は true を意味します
!これは論理の逆演算です。たとえば、int a = 0 (0 は false を意味します)、その後 !0 は true を意味し、! を追加します。、true は false になり、 false は true になります。
-、+: ここでの -、+ は、+2、-3 などの加算と減算の意味ではなく、負の値、正の値を意味します。
&, * .: アドレス演算子、間接アクセス演算子 (分解演算子) この記号については、後のポインタ部分で詳しく説明しますので、お楽しみに! !
sizeof: は、オペランドの型の長さを計算する演算子 (単位はバイト) です。次に例を示します。
印刷結果は以下の通りです
なぜ int 型の長さが 4 なのかについては、以前投稿した はじめての C 言語入門のデータ型の部分に注目してください。
~:数値の 2 進数をビットごとに反転し、元の 0 を 1 に、1 を 0 に変更します。たとえば、1 の 2 進数: 0...00000001、その後 ~ の後には、1... になります。 11111110、大丈夫です
--、++: ++、-- は +1、-1 のビットを大まかに理解できますが、ここでの ++ と -- は前と後ろの 2 種類に分かれており、前を先に使用し、後を使用します。 ++または --、後置位置は++ または -- で、その後に使用されます。具体的にはどのような意味かについては、以下の説明を参照してください。
注意してください。上記の a の値は 1 であり、次に print a++ はフロント ++ です。式によれば、フロント ++ が最初に使用され、次に ++ が使用されます。これは、最初に使用されるためです。最初に出力されるのは値 1 で、次に ++ が続き、次の出力は ++ の後の値 2 です。
それでは、++a の状況、まず ++ を使用してからそれを使用する方法を見てみましょう。
観察するとわかりますが、最初の印刷、最初は ++、a+1 が 2 になり、その後印刷されるため、印刷された値は 2 になり、2 回目の印刷では ++ の後の値は当然 2 になります。
--++ の状況と同様に、コンピュータ上でも考えて実践することができます。ここでもう一度強調したいのは、コンピュータ xdmでもっと実践する必要があるということです。コンピュータを使用することによってのみ、知識をよりよく習得することができます。!
(type):必須の型変換(以下の図の例など)
上の図を観察すると、最初は a が float 型で、次に int 型 b を定義し、a を int に変換すると、1.25 は整数 1 になるため、出力される b は 1 になります。
以上が単項演算子の全内容です。
関係演算子: > >= < <= != ==
ここでの >、<、>=、<= は誰もが知っているので説明は省略しますが、後者の != は等しくない、== は等しいを意味します
ここで = と == の違いについて話しましょう。分類すると、 = は代入演算子で、== は関係演算子であることがはっきりとわかります。コード内で誰が誰と等しいかを示したい場合は、それを使用する必要があります。関係演算子 == です。数値を別の数値に代入することを表現したい場合、当然 = を使用します。明確にわかりますか?
論理演算子: && ||
&&: 論理積
1. && の左辺が false の場合、右辺の判定は行われず、結果は false になります 2.
&& の左辺が true の場合、右辺の判定が行われ、右側が false で結果が false、右側が true で結果が true です。上の図にあるように、論理と論理に関するもので、最初に結果を観察し、理由を考えてから、下の説明を読んで同じ考えがあるかどうかを確認してください。
まず、a = ++a && b++ では、&& の左辺の ++a が true なので、左辺と右辺の式を実行する必要があります ++a 以降は a が 2、b++ 以降は、b は 3 です。左も右も true なので、a の値は最終的に 1 になり、最初に出力される結果は 1 3 になります。
次に、2 番目のものを見てください。 c = --a && ++b では、&& の左側の --a は 0 で、左側は false なので、右側を実行する必要はありません。は 0 になり、 b は 3 のままです。 && の左辺が false であるため、結果も false になり、 c は 0 になるため、出力される結果は 0 3 0 となります。
&& 演算子の左側が false の場合、右側は実行する必要がないという重要な注意点があります。これは間違いが発生しやすい点です。覚えておいてください。!
||: 論理和
1. || の左辺が true の場合、右辺の判定は行われず、結果は true
2. || の左辺が false の場合、右辺右辺が偽なら結果は偽、右辺が真なら結果は真上の図はロジックの操作に関するものですが、いつものように、最初に答えと同じかどうかを計算してから、下の説明を読む必要があります。
まず a = ++a || b++ を見てください。 || の左辺は ++a が 2 に等しいです。これが true であれば、正しい判断 b++ は行われず、結果は true になります。 , a は最終的に 1 ですが、b は変化せず 2 のままなので、出力は 1 2 となります。
次に、c = --a || ++b を見てください。左側の || は、--a が 0 に等しいので false です。したがって、両側が判断し、左側は 0、右側の ++b は次のようになります。 3 であるため、結果は true、つまり c が true であるため、c は 1 に等しいため、出力される結果は 0 3 1 となります。
論理演算子や || 演算子の場合、左辺が true であれば右辺を判定する必要はありませんが、これも無視されやすい点ですので注意してください。
論理演算子andと論理or演算子の具体的な説明です、皆さんよく理解できたと思います(◦˙▽˙◦)
条件演算子: exp1?exp2:exp3
exp1?exp2:exp3 は、exp1 が確立されると exp2 が計算され、式全体の結果が exp2 の結果になることを意味します。
exp1 が確立されていない場合は、exp3 を計算し、式全体の結果が exp3 の結果になります。
簡単な例を挙げると、次のようになります。
int a = 5; int b = 2; int c = a>b?a:b;
上記は、a>b が成立することを意味します。したがって、c の値は a であるため、c は 5 になります。
もちろん、条件演算子には 3 つのオペランドがあるため、三項演算子に属していることに気づきましたか?
カンマ式: exp1,exp2,exp3...expn
コンマ式は、複数の式がカンマで接続されていることを意味し、式全体の結果は最後の式の結果になりますが、前の式は後続の式の結果に影響を与える可能性があるため、前の式を再計算する必要があります。
たとえば、上のスクリーンショット
図では、dの後に条件式があり、まずa+=5を計算し、a=15を計算し、次にb+=aを計算し、b=35を計算し、最後にc=a+bを計算し、c=15+35=50を計算します。 , それで最終的に d の結果は 50 です。
上の式に注目してください。最後の式の結果は前の式の結果に依存するため、式全体の結果が最後の式の結果であっても、順番に計算する必要があります。
添字参照、関数呼び出し、構造体メンバー演算子: [ ] () . ->
添字参照演算子: [ ] は、次のように配列によく使用されます。
int arr[5]={ 0 }; arr[4] = 5;
配列名とそのオペランドの添え字!
関数呼び出し演算子: ()
int my_min(int x,int y) { return x>y?y:x; } int main() { int min =my_min(5,8); printf("%d",min); return 0; }
図の my_min の後の () は、典型的な関数呼び出し演算子です。
この例では、関数名、5、8 の 3 つのオペランドがあります。
構造体のメンバー演算子: . ->
構造部材演算子はこの後学習する構造にたくさん出てきますので、構造学習の中で解説していきますので、お楽しみに٩(๑•̀ω•́๑)۶
整数昇格
C の整数演算は常にデフォルトの整数型の精度で実行されます。(つまり、型はint より小さい数値の型
この精度を達成するために、式内の文字および短整数のオペランドは、使用される前に通常の整数型に変換されます。この変換は、整数昇格と呼ばれます。
整数昇格では、文字と短整数の符号ビットが 32 ビットまで埋められます。符号付き数値の場合は、最上位の符号ビットが埋められます (0 は正を意味し、1 は負を意味します)。符号なし数値の場合は、言い換えれば、単純に加算します。 0
整数のプロモーションを説明するための例をいくつか示します。
例1:
この例を見て、答えを計算してみましょう。
もしかしたら、この質問を見て 132 を口走る生徒もいるかもしれませんが、どういう意味ですか?
おめでとうございます。整数改善の穴にうまく飛び込むことができました。では、答えはどのように計算されるのでしょうか? 具体的には、次のように計算する必要があります。
まず、a と b は両方とも char 型であり、int 型よりも小さいため、算術演算を実行するときに整数の昇格が必要であることに注意してください。
まず、a: 5 を見てください。メモリ内の 5 のバイナリ シーケンスは次のとおりです。
5 は元の正の数の逆補数と同じで、どちらも次のとおりです: 00000000 00000000 00000000 00000101
ただし、char型の数値なので1バイト、つまり8ビットしかなく、00000101しか残せません。
次に、b:127 を見てください。メモリ内のバイナリ シーケンスは次のとおりです。
127 は元の正の数の逆補数とも同じで、どちらも次のようになります: 00000000 00000000 00000000 01111111
b も char 型の数値であるため、a と同様に予約できるのは 8 ビットのみ、つまり 01111111
次に、 char c = a + b を見てください。前述したように、式内の文字と短い整数のオペランドは使用前に通常の整数に変換されるため、a と b は通常の整数型に変換され、32 ビットを埋める必要があります。上で述べたように、これを埋める方法は、a と b が両方とも符号付きの数値であるため、符号ビットが補数になり、符号ビットが 0 であることが観察できるため、次のように 0 を追加して 32 ビットを完成させます。
a:00000000 00000000 00000000 00000101
b:00000000 00000000 00000000 01111111
c=a+b の演算を実行し、加算後は 00000000 00000000 00000000 10000100
c も char 型なので、8 ビットが予約された後: 10000100
その後、 %d 型 (符号付き整数) が出力されるため、整数の昇格も必要です。c は符号付きの数値で、符号ビットは 1 だけ昇格します。つまり、次のようになります。
11111111 11111111 11111111 10000100
補数コードはメモリに保存されており、c の補数コードの符号ビットは 1 であるため、c が負の数であることがわかり、元のコードは補数コード -1 に等しく、その後反転されます。
c の元のコードを計算します: 10000000 00000000 00000000 01111100
c は -124 であると計算されますが、それが正しいかどうかは、以下の計算結果からわかります。
これは整数昇格の最初の例ですが、マスターしましたか?
以下に示すように、C 言語で整数昇格があることを証明する別の例を示します。
char 型は 1 バイト、short 型は 2 バイト、int 型は 4 バイトを占めると前に学びましたが、上記のケースに注目すると、a は char 型、b は short 型なので、当然 a は 1 ワードを占めます。 , b は 2 バイトを占めますが、+a と -b はなぜ 4 バイトになるのでしょうか? 実際、算術演算子 +- があり、整数はint 型に昇格されるため、ここでも整数昇格が発生します。 4バイトアップ!
プラスチック改善の知識が誰でもわかる!
算術変換
前述の整数昇格は int 型より小さいオペランドに対して実行され、次に説明する算術変換は int 型より大きいオペランドに対して行われます。
算術変換とは、演算子のオペランドの型が異なる場合、オペランドの 1 つを別の数値型に変換しない限り演算を実行できないことを意味します。
通常の算術型変換は次のとおりです。
ロングダブル
ダブル
浮く
符号なし長整数
長い整数
符号なし整数
整数
操作中に異なる型のオペランドが見つかった場合、型はBottom から Top に変換される可能性があることに注意してください。
算術変換と整数昇格の方法は似ていますので、整数昇格の知識を参照して理解してください。\(^o^)/~
やっと終わりました。以上が初めてのC言語演算子の全内容です。ご覧いただきありがとうございます。また次のブログでお会いしましょう。
ヾ( ̄▽ ̄)Bye~Bye~
(◦˙▽˙◦) (◦˙▽˙◦)