前の2つのゲームは書かれているので、C言語関連の知識の研究を続けましょう。次に、この記事では、C言語の演算子をいくつか紹介します。これらの演算子は「目立たない」ものですが、非常に役立ちます。私たちが何をすべきか、それでナンセンスを話さないで、今日の研究を始めましょう。
コンテンツ
オペレーター分類
オペレーターは次のとおりです。
- 算術演算子
- シフト演算子
- ビット演算子
- 代入演算子
- 単項演算子
- 関係演算子
- 論理演算子
- 条件操作符
- カンマ式
- 添え字参照、関数呼び出し、および構造体メンバー
1.算術演算子
+-* /%
算術演算子には、加算、減算、乗算、除算、および剰余が含まれます。
これらの演算子の中で、足し算、引き算、掛け算については何も言うことはありません。通常の算術と同じですが、ここでの除算に注意する必要があります。それでも元の除算ですか。
通常の算術によれば、2を3で割った結果は0.6 6のループになるはずですが、これは本当ですか?
最終結果は0です。誰かが言うでしょう、この結果は浮動小数点数でなければなりません、そして%dを%fに置き換えて、結果を見てみましょう。
残念ながら、これは望ましい0.666666ではないので、なぜですか?2つの変数aとbは整数であるため、ここでは整数演算が実行されます。浮動小数点数を出力したいだけの場合はどうなりますか?ここでは、演算子の両側にある任意の数値を浮動小数点数にキャストするだけで済みます。つまり、左右に浮動小数点数がなければなりません。
別の書き方があります:
ここでの印刷は私たちが望むものではありませんが、floatの精度はそれほど高くないためですが、影響はありません。エラーを回避するために、この演算子の使用方法を知っていれば十分です。
'/'に移りましょう:
結果は4.5になるはずですが、最終的には4になります。ここでの整数の計算は自動的に丸められません。余りと組み合わせると、「/」は商の一部のみを計算し、整数を取得することがわかります。
要約すると:
1.'%'演算子に加えて、他のいくつかの演算子が整数と浮動小数点数に作用できます。
2.'/'演算子の場合、両方のオペランドが整数の場合は、整数除算を実行します。また、浮動小数点数がある限り、浮動小数点除算が実行されます。
3.'%'演算子の両方のオペランドは整数でなければなりません。除算後の余りを返します。
2.シフト演算子
<<左シフト演算子
>>右シフト演算子
注:シフト演算子のオペランドは整数のみです。次に、これらの演算子にはバイナリ関連のコンテンツが含まれます。
2.1左シフト演算子
シフト演算子は、aの元の値を変更しません。
ここでbの結果が20であるのはなぜですか?
2.2右シフト演算子
シフト規則:
最初に、右シフト演算には2つのタイプがあり
ます。1。論理シフト
:左側に0を入力し、右側に破棄します
。2.算術シフト
:左側に元の値の符号ビットを入力します。右側に破棄
注:シフト演算子の場合、負のビットをシフトしないでください。これは標準では定義されていません。
そのような:int num = 10;
num >> -1;
3.ビット演算子
ビット演算子は次のように分けられます。
& //(バイナリ)ビット単位AND
| //または(バイナリ)ビット
^ //(バイナリ)ビットによるXOR
注:それらのオペランドは整数でなければなりません。
&ビット単位AND
|ビットごとのAND
^ビット単位のXOR
演算子を使用して、中間変数なしで2つの変数を交換することもできます。
このようにして、aとbが交換されます。
4.代入演算子
名前が示すように、割り当ては値を与えることです
int a = 10;
a = 2;
ここでの「=」は算術と同じではなく、割り当てを意味します。
4.1複合代入演算子
+ =
-=
* =
/ =
%=
>> =
<< =
&=
| =
^
例:+ =
x = x+10;はx+=10;と同等です。
5.単項演算子
!論理的逆演算子
-負の値
+正の値
&アドレスを取得
sizeof オペランドタイプの長さ(バイト単位)
〜数値のビット単位のバイナリを反転します
- フロントリア -
++ pre、post ++
*間接アクセス演算子(逆参照演算子)
(タイプ名)キャスト
ここで紹介しますが、後で使用するときに説明できるので、効果が良くなるかもしれません。
6.関係演算子
>>
> =
<
<=
!=「等しくない」の場合
==「等しい」の場合
ここでは、「==」と「=」の使用法に注意してください。
7.論理演算子
&&論理積
||論理または
これは、これら2つとビット演算子の違いを区別するためのものです。ここに2つあります。
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
論理積の例を見てみましょう。印刷結果はどうなりますか?
結果が間違っていると思う人もいるかもしれませんが、これは正しい結果です。なぜこれなのですか?
&&論理の使用は左から右であり、最後まで計算するには各式がtrueである必要があります。そうでない場合は、ここのようになります。最初にポスト++がプラス1で使用されるため、最初にa = 0、式がfalseであるため、aの後の式は評価されません。
||論理ORの使用規則では、式の1つの式が真である限り、それ以上計算されません。最初はaが偽で、次のbが真であるため、次のdは真になりません。計算されます。
8. 条件操作符
三項演算子とも呼ばれます
exp1?exp2:exp3
a> b?a:b;
それを変換します:
if(a> b)
(a> bの場合はaを実行します)
そうしないと
(それ以外の場合はbを実行します)
9.コンマ式
(exp1、exp2、exp3、…expN)
左から右の順に実行されるコンマ式。式全体の結果は、最後の式の結果です。
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);
最終結果cは13です
10.添え字参照、関数呼び出し、および構造体メンバー
1. []添え字参照演算子
オペランド:配列名+インデックス値
2.()関数呼び出し演算子
は、1つ以上のオペランドを受け入れます。最初のオペランドは関数名であり、残りのオペランドは関数に渡されるパラメーターです。
3.構造体のメンバーにアクセスします
.struct.membername
->構造体ポインタ->メンバー名
11.式の評価
式が評価される順序は、演算子の優先順位と結合性によって部分的に決定されます。
同様に、一部の式のオペランドは、評価中に他のタイプに変換する必要がある場合があります。
11.1暗黙的な型変換
C整数算術演算は、常に少なくともデフォルトの整数型の精度で実行されます。
この精度を実現するために、式の文字と短オペランドは、使用前に通常の整数に変換されます。これは、整数拡張と呼ばれる変換です。
例:
char a、b、c; a = b + c;
bとcの値は通常の整数にプロモートされ、加算演算が実行されます。加算演算が完了すると、結果は切り捨てられてaに格納されます。
//負の数の整数
拡張charc1= -1;
変数c1のバイナリビット(補数)には8ビットしかありません:
1111111
charは符号付きchar
であるため、整数が拡張されると、上位の補足符号ビットは1
です。ブースト後の結果は次のとおりです。補数:11111111111111111111111111111111//正の整数プロモート
charc2= 1;
変数c2のバイナリビット(補数)には8ビットしかありません:
00000001
charは符号付きchar
であるため、整数がプロモートされると、上位の補助符号ビットは0になります。
ブースト後の結果は次のとおりです:
00000000000000000000000000000001//符号なし整数プロモーション、0での上位塗りつぶし
11.2算術変換
演算子のオペランドが異なるタイプの場合、一方のオペランドがもう一方のタイプに変換されない限り、操作を続行できません。次の階層は、通常の算術変換と呼ばれます。
高 レベル longdoubledouble float unsigned long int long intunsignedint 低
レベル int
オペランドのタイプが上記のリストの下位にある場合、操作は最初に他のオペランドのタイプに変換することによって実行されます。
警告:
ただし、算術変換は合理的である必要があります。そうしないと、潜在的な問題が発生し、精度が低下する可能性があります。
11.3演算子の属性
複雑な式の評価に影響を与える3つの要因があります。
1.演算子の優先度
2.演算子の結合性
3.評価順序を制御するかどうか。
2つの隣接する演算子のどちらが最初に実行されますか?それらの優先順位に応じて。両方が同じ優先順位を持っている場合、それはそれらの関連性に依存します。
結論:
一年が過ぎた後も、一生懸命勉強を続けましょう。