第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) ) { とすることを強く勧めます。
では、一番優先順位が高く、先に解釈される演算子は何でしょう?
当然ですが、( ) です。