第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) ) { とすることを強く勧めます。
では、一番優先順位が高く、先に解釈される演算子は何でしょう?
当然ですが、( ) です。
< 前のページへ 次のページへ >-
IS 559680 / ISO27001
認証範囲 本社、芝大門オフィス情報セキュリティ基本方針 -
個人情報保護方針
個人情報の取扱いについて
保有個人データ又は
第三者提供記録に関する
事項の周知について
特定個人情報の取扱いについて -
FS 671851 / ISO9001
認証範囲 本社、芝大門オフィス品質方針