この記事では、C言語における演算子の優先順位について詳しく解説します。
演算子の役割や種類、優先順位の重要性から始め、基本的な演算子の優先順位や括弧の利用方法、複雑な式の評価方法までをわかりやすく説明します。
また、注意点やよくある間違いについても解説するので、演算子の優先順位を正しく理解するためのポイントを押さえることができます。
演算子の優先順位とは
演算子の優先順位とは、複数の演算子が式内に存在する場合に、どの演算子が先に評価されるかを決定するためのルールです。
C言語では、演算子の優先順位によって式の評価結果が変わることがあります。
正しい優先順位を理解することは、正確な計算結果を得るために非常に重要です。
演算子の役割と種類
演算子は、プログラムで数値や変数に対して行われる操作を表す記号です。
C言語には、以下のような演算子があります。
演算子 | 種類 | 説明 |
---|---|---|
+ | 算術演算子 | 加算演算子。2つの数値を加算します。 |
– | 減算演算子。2つの数値を減算します。 | |
* | 乗算演算子。2つの数値を掛け合わせます。 | |
/ | 除算演算子。1つの数値をもう一つの数値で割ります。 | |
% | 剰余演算子。1つの数値をもう一つの数値で割った余りを求めます。 | |
= | 代入演算子 | 代入演算子。右辺の値を左辺の変数に代入します。 |
+= | 加算代入演算子。左辺の変数に右辺の値を加え、結果を左辺の変数に代入します。 | |
-= | 減算代入演算子。左辺の変数から右辺の値を引き、結果を左辺の変数に代入します。 | |
*= | 乗算代入演算子。左辺の変数に右辺の値を掛け、結果を左辺の変数に代入します。 | |
/= | 除算代入演算子。左辺の変数を右辺の値で割り、結果を左辺の変数に代入します。 | |
== | 比較演算子 | 等しいかどうかを比較する演算子。 |
!= | 等しくないかどうかを比較する演算子。 | |
< | より小さいかどうかを比較する演算子。 | |
> | より大きいかどうかを比較する演算子。 | |
<= | 以下かどうかを比較する演算子。 | |
>= | 以上かどうかを比較する演算子。 | |
&& | 論理演算子 | 論理積演算子。2つの条件が両方とも真である場合に真を返します。 |
|| | 論理和演算子。2つの条件のいずれかが真である場合に真を返します。 | |
! | 論理否定演算子。条件を反転させます。 | |
& | ビット演算子 | 論理積演算子。2つのビット列の対応するビットの論理積を計算します。 |
| | 論理和演算子。2つのビット列の対応するビットの論理和を計算します。 | |
^ | 排他的論理和演算子。2つのビット列の対応するビットの排他的論理和を計算します。 | |
~ | ビット反転演算子。ビット列の各ビットを反転させます。 | |
<< | 左シフト演算子。ビット列を指定されたビット数だけ左にシフトします。 | |
>> | 右シフト演算子。ビット列を指定されたビット数だけ右にシフトします。 | |
sizeof | その他の演算子 | オペランドのサイズ(バイト数)を取得します。 |
?: | 条件演算子。指定された条件が真の場合は式1を、偽の場合は式2を評価します。 | |
& | アドレス演算子。変数のアドレスを取得します。 | |
* | 間接参照演算子。ポインタ変数が指す値を取得します。 |
それぞれの演算子は、特定の役割を持っており、異なる種類の演算を行います。
例えば、算術演算子は数値の計算を行い、比較演算子は値の比較を行います。
演算子の優先順位の重要性
演算子の優先順位は、式内の演算子がどの順番で評価されるかを決定します。
優先順位が高い演算子は、優先順位が低い演算子よりも先に評価されます。
例えば、算術演算子の優先順位は、乗算や除算が加算や減算よりも先に評価されるようになっています。
優先順位を正しく理解することは、式の評価結果を正確に把握するために非常に重要です。
演算子の優先順位を無視すると、意図しない結果が得られる可能性があります。
以下に、演算子の優先順位を考慮しない場合と優先順位を考慮した場合の計算結果の違いを示します。
#include <stdio.h>
int main() {
int result1 = 5 + 3 * 2; // 演算子の優先順位を無視した場合
int result2 = (5 + 3) * 2; // 演算子の優先順位を考慮した場合
printf("result1: %d\n", result1);
printf("result2: %d\n", result2);
return 0;
}
上記のコードを実行すると、以下のような結果が得られます。
result1: 11
result2: 16
演算子の優先順位を無視した場合、式が左から右に評価されるため、5 + 3が先に評価され、その結果に2を乗算します。
一方、演算子の優先順位を考慮した場合、括弧内の式が先に評価され、その結果に2を乗算します。
結果として、計算結果が異なることがわかります。
以上が、演算子の優先順位についての説明です。
正しい優先順位を理解し、適切に演算子を使用することで、正確な計算結果を得ることができます。
基本的な演算子の優先順位
演算子の優先順位は、式内の演算子がどの順番で評価されるかを示すものです。
演算子の優先順位を正しく理解することは、正確な計算結果を得るために非常に重要です。
算術演算子
算術演算子は、数値の計算に使用されます。
以下に一般的な算術演算子を示します。
演算子 | 説明 |
---|---|
+ | 2つの数値を足し合わせます。 |
– | 2つの数値を引き算します。 |
* | 2つの数値を掛け合わせます。 |
/ | 2つの数値を割り算します。 |
% | 2つの数値の剰余を求めます。 |
算術演算子の優先順位は、乗算演算子と除算演算子が加算演算子と減算演算子よりも優先されます。
また、同じ優先順位の演算子は左から右に評価されます。
以下に例を示します。
#include <stdio.h>
int main() {
int a = 10;
int b = 5;
int c = 2;
int result = a + b * c; // 10 + 5 * 2 = 20
printf("結果: %d\n", result);
return 0;
}
上記の例では、乗算演算子が加算演算子よりも優先されるため、b * c
が先に評価されます。
その後、その結果にa
を加算しています。
代入演算子
代入演算子は、変数に値を代入するために使用されます。
以下に一般的な代入演算子を示します。
演算子 | 説明 |
---|---|
= | 右辺の値を左辺の変数に代入します。 |
+= | 右辺の値を左辺の変数に加算して代入します。 |
-= | 右辺の値を左辺の変数から減算して代入します。 |
*= | 右辺の値を左辺の変数に掛けて代入します。 |
/= | 右辺の値を左辺の変数で割って代入します。 |
代入演算子の優先順位は、算術演算子と同じく右結合性を持ちます。
つまり、右辺の式が先に評価され、その結果が左辺の変数に代入されます。
以下に例を示します。
#include <stdio.h>
int main() {
int a = 10;
int b = 5;
int c = 2;
a += b * c; // a = a + (b * c) = 10 + (5 * 2) = 20
printf("結果: %d\n", a);
return 0;
}
上記の例では、b * c
が先に評価され、その結果がa
に加算されています。
比較演算子
比較演算子は、2つの値を比較して真偽値(trueまたはfalse)を返すために使用されます。
以下に一般的な比較演算子を示します。
演算子 | 説明 |
---|---|
== | 2つの値が等しい場合にtrueを返します。 |
!= | 2つの値が等しくない場合にtrueを返します。 |
> | 左辺の値が右辺の値よりも大きい場合にtrueを返します。 |
>= | 左辺の値が右辺の値以上の場合にtrueを返します。 |
< | 左辺の値が右辺の値よりも小さい場合にtrueを返します。 |
<= | 左辺の値が右辺の値以下の場合にtrueを返します。 |
比較演算子の優先順位は、算術演算子や代入演算子よりも低くなります。
また、同じ優先順位の演算子は左から右に評価されます。
以下に例を示します。
#include <stdio.h>
int main() {
int a = 10;
int b = 5;
int c = 2;
int result = a > b + c; // 10 > 5 + 2 = 10 > 7 = false
printf("結果: %d\n", result);
return 0;
}
上記の例では、比較演算子より優先順位が高い加算演算子が先に評価され、その結果が比較演算子によって評価されています。
論理演算子
論理演算子は、真偽値を組み合わせて新しい真偽値を生成するために使用されます。
以下に一般的な論理演算子を示します。
演算子 | 説明 |
---|---|
&& | 2つの条件が両方ともtrueの場合にtrueを返します。 |
|| | 2つの条件のうち少なくとも1つがtrueの場合にtrueを返します。 |
! | 条件の真偽値を反転させます。 |
論理演算子の優先順位は、比較演算子よりも低くなります。
また、論理積(&&)が論理和(||)よりも優先されます。
以下に例を示します。
#include <stdio.h>
int main() {
int a = 10;
int b = 5;
int c = 2;
int result = a > b && b > c; // (10 > 5) && (5 > 2) = true && true = true
printf("結果: %d\n", result);
return 0;
}
上記の例では、論理演算子より優先度が高い比較演算子が先に評価され、その結果が論理積によって評価されています。
以上が基本的な演算子の優先順位についての説明です。
正しい優先順位を理解し、適切に演算子を使用することで、正確な計算結果を得ることができます。