間接演算子「*(アスタリスク)」とインクリメント演算子「++」の優先順位

C言語でポインタを使うと間接演算子「*(アスタリスク)」を使うことになりますが、この間接演算子にインクリメント演算子「++」が加わると、どちらを先に演算するのか混乱してしまうときがあります。以下の例について、どういう演算かわかりますか?
p はポインタ変数です。

1. ++*p;
2. *++p;
3. *p++;
4. (*p)++;

1. は、pが指す値自体をインクリメントして参照します。
2. は、pのポインタ位置をインクリメントしてpが指す値を参照をします。
3. は、pが指す値を参照してから、pのポインタ位置をインクリメントします。
4. は、pが指す値を参照してから、pが指す値自体をインクリメントします。

間違いやすいのは、たぶん 3.じゃないかと思います。後置演算の「++」が「*p」にかかるのか「p」にかかるのか、というところです。3. の場合は「p」にかかります。

実際にこれらの演算を行って結果を表示するプログラムを載せておきます。結果を推測してみてください。

コピペするならこちらをお使いください。


#include <stdio.h>

int main( void )
{
	char *p;
	char a[] = { 1, 3, 5, 7 }; 

	p = a;

	/* pの指す値 */
	printf( "0: %d\n", *p );

	/* pの指す値をインクリメント */
	printf( "1: %d\n", ++*p );
	
	/* ポインタをインクリメントしてからpの指す値を参照 */
	printf( "2: %d\n", *++p );

	/* pの指す値を参照後にポインタをインクリメント */
	printf( "3: %d\n", *p++ );
	printf( "4: %d\n", *p );

	/* pの指す値を参照後にpの指す値をインクリメント */
	printf( "5: %d\n", (*p)++ );
	printf( "6: %d\n", *p );

	return 0;
}

結果は以下となります。

$ ./a.out
0: 1
1: 2
2: 3
3: 3
4: 5
5: 5
6: 6

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。