わさっきhb

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

こんにちは,エラーのある世界 (2)¥nのnがなかったら

こんにちは,エラーのある世界(0)のhello.cについて,5行目,「hello, world」のあとは「¥n」,そして文字列*1の終わりとなる「"」を書いていました.「n」の文字を取り除いて,hello2.cという名前で保存します.このファイルをコンパイルすると,エラーになります.
コマンドは:

$ cat hello2.c
#include <stdio.h>

int main(void)
{
  printf("hello, world\");

  return 0;
}
$ cc hello2.c
hello2.c: In function ‘main’:
hello2.c:5:10: warning: missing terminating " character
   printf("hello, world\");
          ^
hello2.c:5:10: error: missing terminating " character
   printf("hello, world\");
          ^~~~~~~~~~~~~~~~~
hello2.c:7:3: error: expected expression before ‘return’
   return 0;
   ^~~~~~
hello2.c:8:1: error: expected ‘;’ before ‘}’ token
 }
 ^

実行環境1では:

実行環境2では:

エラー箇所は「hello2.c:5:10: error: missing terminating " character」です.日本語にすると,「hello2.cの5行目・10文字目で,エラー.文字列の終端となる"がありません」といったところでしょうか.hello2.cの5行目・10文字目は,「printf(」の直後の「"」(引用符)なのですが,これに対応する,閉じる引用符がないというエラーです.
同じ行の「);」の左に,「"」があるじゃないか,と言いたいところですが…
さらに左に「¥」の文字があり,これがくっついて「¥"」は,Cのプログラムにおいては「"」1文字を表します.エスケープシーケンスの一つであり,https://webkaru.net/clang/escape-sequence/で整理されています.文字列の終端の意味を失ってしまいまして,コンパイラがその後の行や文字を見ていっても,「"」がない,ということでエラーを報告したのでした.
メッセージをさらに見ていくと,「hello2.c:7:3: error(略)」というのと「hello2.c:8:1: error(略)」というのもありますが,これらには対処する必要がありません.最初に削除したnの文字を元に戻して,5行目を「printf("hello, world¥n");」に書き換えてから(保存も忘れずに!),コンパイルし直せば,エラーが出なくなります.Cにおいてエラーが多数発生した場合は,上の行から対処していくことで,効率よくデバッグができます.

*1:正式には「文字列リテラル」と言います.