質問: rand() % (i + 1); のように先に乱数を代入しておき、 swap(int, a[i], a[rnd]); を呼び出すと、(本来はif(i != rnd){/* ... */}の条件を付けていますが、仮に付けなくても) 正しくシャッフルされた形の配列が得られます。 上記プログラムのような引数の渡し方の場合、どのような処理が起こって 別の添字要素に影響を及ぼしているのかいまいち分かりません。 ご教授のほど、よろしくお願い致します。
回答: C言語のマクロは、あくまで文字列として展開されます。そのため、展開後は ``` do{ int t = num[i]; num[i] = num[ rand() % (i + 1)]; num[ rand() % (i + 1)]= t; }while(0) ``` となって、`rand()`が2回実行されてしまいます。関数呼び出しでなくても、`i++`のようなものをマクロ引数にすると似たようなことになってしまいます。