いきなりですが問題です.C言語で書かれた以下のプログラムをコンパイル・実行すると,何が出力されるでしょうか.
/* j.c */ #include <stdio.h> int main(void) { int i, j; for (j = 1; j <= 5; j++) { for (i = 1; i <= 2 * j - 1; i++) { putchar('*'); } putchar('\n'); } return 0; }
さっそくですが解答です.
$ gcc -o j j.c && ./j * *** ***** ******* *********
出力は5行で,先頭から順に1個,3個,5個,7個,9個の「*」を出力します.
ここからが本題です.以下のプログラムをコンパイル・実行すると,何が出力されるでしょうか.
/* 2j.c */ #include <stdio.h> int main(void) { int i, j; for (j = 1; j <= 5; j++) { for (i = 1; i <= 2j - 1; i++) { putchar('*'); } putchar('\n'); } return 0; }
コンパイルエラーとなります.
$ gcc -o 2j 2j.c && ./2j 2j.c: In function ‘main’: 2j.c:6:19: error: invalid operands to binary <= (have ‘int’ and ‘complex int’) 6 | for (i = 1; i <= 2j - 1; i++) { | ^~ ~~~~~~ | | | complex int
iは整数値なのに対して,「2j - 1」は,complex int,すなわち,実部も虚部も整数の複素数と解釈されています.
「2j - 1」を,高校数学の表記にすると,となり,このは虚数単位です.「2j - 1」の「j」も,虚数単位です---電気の分野ではしばしば,jが,虚数単位として採用されています.
複素数の大小比較は行えない,ということでコンパイルエラーになったのでした.
2jを含むソースコードは,授業時間外の学生の質問で知りました.修正は簡単で,「2j」のところを冒頭のように「2*j」に変更するだけです(「j*2」でもかまいません).
上でエラーとなったプログラムについて,iとjを交換してコンパイルすると,iとjを交換して(このときは「i」が虚数単位*1),同じエラーメッセージになりました.「2j」を「j2」に書き換えるのは,また別のエラーです.