わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

2j

 いきなりですが問題です.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」を,高校数学の表記にすると,-1+2iとなり,このi虚数単位です.「2j - 1」の「j」も,虚数単位です---電気の分野ではしばしば,jが,虚数単位として採用されています.
 複素数の大小比較は行えない,ということでコンパイルエラーになったのでした.
 2jを含むソースコードは,授業時間外の学生の質問で知りました.修正は簡単で,「2j」のところを冒頭のように「2*j」に変更するだけです(「j*2」でもかまいません).
 上でエラーとなったプログラムについて,iとjを交換してコンパイルすると,iとjを交換して(このときは「i」が虚数単位*1),同じエラーメッセージになりました.「2j」を「j2」に書き換えるのは,また別のエラーです.

*1:変数iと別に,数学では0+iの形で表せる複素数を,Cでどう書けばよいかというと…「1i」です.