演算子の詳しい解説(C言語)

はじめに:
みなさん、こんにちは!私の名前は sy です。今日は C 言語の演算子について詳しく説明します。C 言語の特徴は式の適用であることはご存知です。式は値の計算方法を表す式であり、演算子は計算に使用されます。 C 言語には、算術演算子、関係演算子、論理演算子、代入演算子、ビット演算演算子、インクリメント演算子およびデクリメント演算子、条件演算子、カンマ演算子、ポインタ演算子、バイト カウント演算子などの非常に豊富な演算子セットがあります。 、キャスト演算子、および特殊演算子。この記事では各演算子について詳しく説明していますので、見てみましょう~!

1. 算術演算子 (+、-、​​、/、% を含む)

·1. 算術演算子は、C 言語を含む多くのプログラミング言語で広く使用されている演算子で、加算、減算、乗算、除算、剰余を実行できます。
·2. 加算演算子と乗算演算子はどちらも二項演算子でオペランドが 2 つ必要ですが、単項演算子はオペランドが 1 つだけ必要です: i=+1; i=-1; (通常 + は何もしません) *3. を除くことに注意して
ください。 % 演算子、その他の二項算術演算子では、オペランドを整数と浮動小数点数の両方にすることができ、この 2 つの混合も可能です。剰余演算子 % では、オペランドが整数である必要があります。2 つの数値のうちの 1 つが整数でない場合、コンパイルは失敗します。
*4.演算子 '/' 両方のオペランドが整数の場合、演算子 '/' は小数部分を切り捨てて結果を切り取ります。したがって、1/2 の結果は 0.5 ではなく 0 になります。

//当int型操作数和float型操作数混合在一起时,运算结果是float型的
	int a = 7;
	float b = 3.5;
	printf("%f\n", a + b);
	printf("%f\n", a/b);

操作結果は以下の通りです

2. 関係演算子 (>、<、==、>=、<=、!= を含む)

·1. C 言語の式の結果は 0 (偽) または 1 (真) です。たとえば、式 3<5 の値は 1、3>5 の値は 0 です。関係演算子も適しています。浮動小数点数の比較に使用します。また、次のような混合オペランドの比較も可能です: 1<2.5 の値は 1; ·
2。関係演算子の優先順位は、算術演算子の優先順位よりも低くなります。例: 式 i+j <k-1 は (i +j)<(k-1) を意味します。関係演算子は左結合です。
*3.注: C 言語では i<j<k は正当ですが、この式は、< 演算子が残っているため、j が i と k の間にあるかどうかをテストしていません (正しい式: i<j&&j<k)。つまり、この式は (i<j)<k と等価です。つまり、最初に i が j より小さいかどうかを確認し、次に比較の結果 (1 または 0) を使用してそれを k と比較します。
*4.注: 「等しい」は、1 つの = ではなく、2 つの隣接する = です。== および != 演算子は、大なり小なり関係演算子よりも優先順位が低いことに注意してください。

写真のように

3. 論理演算子 (!、&&、||)

・1. ! 、&&、|| はそれぞれ論理 NOT、論理 AND、および論理 OR です (! は単項演算子、&&、|| は二項演算子です)。論理演算子によって生成される結果は 0 または 1、およびゼロ以外の値です。演算対象となります。数値は true 値として扱われ、ゼロ値は false 値として扱われます。ルールは次のとおりです:
·2.の値が 0 の場合、! の結果は 1;
・3.式 1式 2の値が両方とも 0 以外の場合、式 1 &&式 2の結果は 1;
・ 4.式 1またはの値の場合2 値のいずれかが 0 以外の場合、式 1 ||式 2 は1 と評価されます。
*5.演算子 && と || は両方ともオペランドに対して「ショートサーキット」計算を実行します。左辺値が最初に計算され、次に右辺値が計算されます。式の値が左オペランドの値からのみ導出できる場合、正しい値を計算する必要はありません。値。例: (i != 0) && (i/j> 0)、i が 0 に等しくない場合、右辺値が計算されます。i が 0 に等しい場合
*6.演算子!を計算する必要はありません。右結合、&& および || は左結合です。

写真のように

4. 代入演算子 (=、+=、-=、*=、/=、%=、&=、|=、^=、>>=、<<=)

·1. 式 a=b (b は定数、変数、またはより複雑な式にすることができます); a と b の型が異なる場合、代入演算が行われるときに b の値は a の型に変換されます。 。
例: int i = 0;
i = 6.66f //この時点では i は 6 です。
·2. 代入演算子は複数の代入を連結できます (例: i = j = k = 0;
·3. 演算子 = は右結合であるため、上記の式は i = (j = (k = 0 )) と同等です。 ;
·4. 代入演算子の左オペランドは左辺値である必要があります。左辺値は定数や計算結果ではなく、オブジェクトを表します。変数は左辺値であり、10 や 2*i などの式は左辺値ではありません。 。
·5. 複合代入: i += 2、i = i + 2 と同等。

5. ビット演算演算子(<<、>>、~、&、^、|)

·1. シフト演算子には、整数のバイナリ ビットを左または右にシフトできる左シフト (<<) と右シフト (>>) が含まれます。それらのオペランドは、任意の整数型 (char を含む) にすることができ、シフト演算子は次のように実行します。両方のオペランドで整数昇格が行われ、戻り値の型は左側のオペランドの昇格型になります。
·2. i << j の値は、i の 2 進ビットを j ビット左にシフトした結果です。i の左端から 1 ビットがオーバーフローするたびに、i の右端に 0 ビットが追加されます。 i; i >> j 値は、i の 2 進ビットを j ビット右にシフトした結果です。
·3. 右シフト演算子には算術右シフトと論理右シフトの 2 種類があることに注意してください 算術右シフト: 右側を破棄し、左側に元の符号ビットを埋めます。 0の場合は0を埋め、1の場合は埋める 1; 論理右シフト:右側を破棄し、左側に直接0を加算する ·4.
シフト演算子は算術演算子よりも優先順位が低くなります。 . i << 2+1 は、i << (2+1) · 5 と同等です。
~、&、^、| は、それぞれビットごとの否定、ビットごとの AND、ビットごとの XOR、およびビットごとの OR です。このうち、~ は単項演算子、その他は 2 項演算子です。~ はオペランドの各ビットを反転する、つまり、各 1 を 0 に置き換え、0 を 1 に置き換えます。& は対応するビットに対してロジックを実行します。演算と同様、演算子 ^ と | は 2 つのオペランドに対して論理 OR 演算を実行します。違いは、両方のオペランドが 1 の場合、^ は 0 を生成し、| は 1 を生成することです。

写真のように
写真のように

6. インクリメント演算子とデクリメント演算子 (++、- -)

・「自動インクリメント」(1を加算) 「自動デクリメント」(1を減算)、++、- - 演算子は接頭辞(++i、- -i)または接尾辞(i++、i- -)として使用できます。 、プレフィックスは使用前に 1 ずつインクリメントされ、サフィックスは使用後に 1 ずつインクリメントされます。

    int i = 1;
	printf("i is %d\n", ++i);
	printf("i is %d\n", i);
	int j = 1;
	printf("j is %d\n", j++);
	printf("j is %d\n", j);

演算結果

7. 条件演算子 (?:)

・条件式:式1式 2 :3。C 言語の唯一の三項演算子です。この式は次のように解釈できます。式 1が true の場合は式 2が実行され、それ以外の場合は式 3が実行されます。
*注: 条件演算子は、代入演算子を除く他のすべての演算子よりも優先順位が低くなります。

8. カンマ演算子 ( , )

·1. カンマ式:式 1式 2、カンマ式の値は 2 つのステップで実現する必要があります。最初のステップは式 1の値を計算することです。第 2 ステップは式 2の値を計算することです。これを入れます。 value は式全体の値です。
·2. 式 1 の値は完全に破棄されるわけではないことに注意してください。式 1 の結果が式 2 に影響を与える場合、その値は引き続き機能しますが、最終的な値は式 2 の値になります。

9. ポインタ演算子 (&、*)

·1. 変数のアドレスを見つけたい場合は、& (アドレス演算子) を使用できます。x が変数の場合、&x はメモリ内の x のアドレスです。ポインターが指すオブジェクトへのアクセスを取得するには、* (間接アドレス指定演算子) を使用できます。p がポインターの場合、*p は現在 p が指すオブジェクトを表します。
·2. ポインタ変数を初期化する場合は、& 演算子を使用して変数のアドレスを代入します。例えば:

    int i,j, * p;//方法一
	p = &i;
	int* pa = &j;//方法二

· ポインタ変数がオブジェクトを指すようになると、* 演算子を使用してオブジェクトに格納されているコンテンツにアクセスできるようになります。たとえば、p が i を指している場合、次のように i の値を表示できます。

printf("%d\n", *p)

10. バイト数を求める演算子(sizeof演算子)

·1.sizeof 式: sizeof (型名)、sizeof 演算子を使用すると、プログラムは指定された型の値を格納するために必要なスペースを取得できます。その値は符号なし整数で、属する値を格納するのに必要なバイト数を表します型名に。式 sizeof(char) は 1 に評価され、通常はコンパイラ自体が sizeof 式の値を決定できます。
·2. sizeof の値を表示する場合、sizeof 式の型は size_t であり、size_t は符号なし整数である必要があることに注意してください。C99 では、printf は強制的な変換を必要とせずに、size_t の型の値を直接表示できます。

printf("Size of int:%zd", sizeof(int));//输出:Size of int:4

11. 強制型変換演算子 ((型名))

・C言語では(型名)を単項演算子として扱い、単項演算子の優先順位が二項演算子よりも高く、(unsigned int)時刻(NULL)、(unsigned int)は強制型変換となります。

12. 特殊演算子 ([ ]、-->、.、())

·1.[ ] は配列の添字インデックス演算子で、配列内の個々の要素を取得できます。次の表の演算子には 2 つのオペランドが必要です。1 つのオペランドは配列名で、もう 1 つは整数です。
·2.——>演算子と.演算子は、構造体がメンバ変数にアクセスするときによく使用されます。オブジェクト b のアドレスが Print 関数に渡される場合、print 関数の実装時に構造体ポインターを使用してアドレスを受け取り、印刷時にメンバー変数を指すために --> が使用されます。アドレスが渡されない場合は、メンバー アクセス演算子を直接使用してアクセスすることもできます。
·3. 少なくとも 1 つのオペランドを必要とする関数名 (仮パラメータ リスト) 関数名とパラメータ リストは、ユーザーの必要に応じて設定できます。

struct Student
{
    
    
	char name[20];
	int age;
};
void Print(struct Student* pb)
{
    
    
	printf("%s %d\n", pb->name, pb->age);
}
int main()
{
    
    
	struct Student b = {
    
    "小明", 20};
	printf("%s %d\n", b.name, b.age);
	Print(&b);
	return 0;
}

13. 添付: オペレーター優先順位表

ここに画像の説明を挿入します
読んでくれた友達に感謝します。コメント欄にメッセージを残してください~!
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/m0_74475605/article/details/131977460