C/C++における前置++と後置++の優先順位の違いを徹底解説
C/C++における前置++と後置++の優先順位
この記事では、C言語およびC++における前置インクリメント(++)と後置インクリメント(++)の演算子の優先順位について詳しく解説します。
まず、押さえておくべき重要なポイントは以下の2点です。
- 前置の
++や--は、間接参照(デリファレンス)演算子*よりも優先順位が高い - 後置の
++や--は、前置の++と間接参照演算子*のどちらよりも優先順位が高い
そのため、ptr がポインタである場合、*ptr++ は *(ptr++) と解釈され、++*ptr は ++(*ptr) と解釈されます。一見似ているこれらの式ですが、実際の動作はまったく異なるので注意が必要です。
例1:++*ptr の動作
#include<iostream>
using namespace std;
int main() {
char arr[] = "Hello World";
char *ptr = arr;
++*ptr;
cout << *ptr;
return 0;
}
出力:
I
この例では、最初にポインタ ptr は文字列の先頭文字 'H' を指しています。++*ptr を実行すると、ポインタが指す先の値である 'H' が1つ増やされ、'I' になります。つまり、ポインタ自体は動かず、指し示すデータが変更されるのです。
例2:*ptr++ の動作
#include<iostream>
using namespace std;
int main() {
char arr[] = "Hello World";
char *ptr = arr;
*ptr++;
cout << *ptr;
return 0;
}
出力:
e
この例でも、最初にポインタ ptr は 'H' を指しています。しかし *ptr++ を実行すると、後置 ++ の優先順位が高いため、今度はポインタ自体がインクリメントされ、次の要素 'e' を指すようになります。その結果、出力されるのは 'e' となります。
まとめ:両者の違いを比較表で確認
| 式 | コンパイラによる解釈 | 実際の効果 |
|---|---|---|
++*ptr | ++(*ptr) | ポインタが指す値を1増やす |
*ptr++ | *(ptr++) | ポインタを次の要素へ進める |
このように、前置と後置のどちらを使うかによって、同じように見える式でも全く異なる意味を持つことがあります。ポインタ操作を行う際は、演算子の優先順位を意識してコードを書くことで、意図しないバグを防ぐことができます。
-
C++で前置記法(プレフィックス)から後置記法(ポストフィックス)へ変換する方法
この問題では、前置記法(プレフィックス)で表された式が与えられ、それを後置記法(ポストフィックス)に変換して出力することが求められます。 前置記法と後置記法とは 前置記法(プレフィックス記法)は、演算子がオペランド(被演算子)の前に置かれる表記方法です。 例:+AB 後置記法(ポストフィックス記法)は、演算子がオペランドの後に置かれる表記方法です。 例:AB+ なお、この変換処理では、中置記法(インフィックス)を経由せずに、直接前置記法から後置記法へ変換する必要があります。 問題例 具体的な例を見てみましょう。 入力:/+XY+NM 出力:XY+NM+/ 説明:中置記法に直すと (X+Y)/(
-
C++の前置演算子(++i)と後置演算子(i++)の違いを徹底解説
C++のインクリメント演算子には、前置(プレフィックス)形式と後置(ポストフィックス)形式の2種類があります。どちらも変数の値を1つ増やしますが、式として返す値が異なるため、この違いを正しく理解することが重要です。 前置演算子(++i)の動作 前置形式(++i)では、まず変数iの値がインクリメントされ、式の値としては「インクリメント後の新しい値」が返されます。つまり、「先に値を増やし、その結果を式に渡す」という順序で処理が行われます。 後置演算子(i++)の動作 一方、後置形式(i++)では、変数i自体はインクリメントされますが、式の値としては「インクリメント前の元の値」が返されます。つま