第10章 C言語の関数2 ~ 外部変数とstatic変数の説明を含む ~

休憩室

 今回は、ある実験です。

 リスト24で、一つ目の引数の値と、二つ目の引数の値を交換する関数を作りましたね。 その関数の中で、こっそりと値が1ずつ増えるようにしてみましょう。

— リスト24`` —

#include <stdio.h>

/**
* 関数プロトタイプ宣言
*/
void swap(int *px, int *py);

void main() {
  int x, y;

  x = 90;
  y = 120;

  printf("x = %d y = %d\n", x, y);

  swap(&x, &y);

  printf("x = %d y = %d\n", x, y);
}


/**
* 一つ目の引数の値と、二つ目の引数の値を交換する
*/
void swap(int *px, int *py) {
  int temp;

  temp = *px;
  *px = *py;
  *py = temp;

  *px++;
  *py++;
}

 結果は、どうなりましたか? 全くカウントアップされなかったことだと思います。

 変数のアドレスを渡したから、関数の中で値を書き換えた場合、 呼び出し元の変数の値が書き換わるはずですね。 それとも、++演算子には、対応してないのでしょうか?

 この原因は演算子の優先順位です。

 *px を++してるつもりでしたが、* よりも++ の方が、 先に解釈されるために、アドレスを++したことになります。 このため、期待していた答えの91と121にはならないのです。

 通常の数学では、+ や – よりも * や / の方が、優先順位が高くなっていますね。 この程度だと、とても単純です。C言語では、演算子はこれだけではありません。 [] や、* や & や、&&、||、!= など、いろいろあり、 優先順位が決まっています。 ここでは一覧は載せませんので、他の書籍を参照してください。

 演算子の優先順位を自分で勝手に思いこむと、たいへんなことになります。 中でも *px++ は、一番間違えの起きやすいものです。

 また、if ( cnt <= 10 || cnt >= 0) { とした場合でも、 たまたま、「||」の優先順位が低くく、後から解釈されるために正常に動きます。 しかし、if ( (cnt <= 10) || (cnt >= 0) ) { とすることを強く勧めます。

 では、一番優先順位が高く、先に解釈される演算子は何でしょう?

 当然ですが、( ) です。

< 前のページへ

Pagetop