問題① main関数をコメントアウトするとどうなるでしょう。
たとえば、次のように main関数全体を /* と */ で囲みます。
#include <stdio.h>
/*
int main(void)
{
puts("Hello, World");
}
*/
main関数は必須なので、無効化されてしまうと、コンパイルエラーになります。
問題② 次のプログラムをコンパイルするとエラーになるでしょうか?(まず考えてから、試してください)
#include <stdio.h>
int main(void)
{
/*
char input_string[80];
/*
*/
/*/
fgets(input_string, sizeof(input_string), stdin);
printf("%s", input_string);
*/
}
色分けするとこうなります。
#include <stdio.h>
int main(void)
{
/*
char input_string[80];
/*
*/
/*/
fgets(input_string, sizeof(input_string), stdin);
printf("%s", input_string);
*/
}
C言語のコメントは入れ子にできないルールですから、まず最初のコメントは、5~8行目の部分です。したがって実質は次のような状態です。
#include <stdio.h>
int main(void)
{
/*/
fgets(input_string, sizeof(input_string), stdin);
printf("%s", input_string);
*/
}
/*/
はコメントの開始のようにも終わりのようにもみえますが、ここではコメントの開始になります(手前の文字から順番に処理されていくと考えればよいです)。このコメントの終わりは、printf関数の呼び出しの次の行にある
*/
のところです。したがって実質は次のような状態だと分かります。
#include <stdio.h>
int main(void)
{
}
結局、main関数の中身は何もないことになります。コンパイルは正常に行えます。
問題③ 次のプログラムは正しいでしょうか。
#include <stdio.h>
int main(void)
{
/* puts関数に変えてみた
printf("コメントは /* と */ で挟む\n");
*/
puts("コメントは /* と */ で挟む");
}
正しくありません。printf関数の部分をコメントアウトしたつもりですが、printf関数が出力しようとしていた文字列の中に、コメントの終わりを表す
*/
が含まれてしまっているため、コメントアウトの効果が途切れてしまいます。
色分けするとこうなります。
#include <stdio.h>
int main(void)
{
/* puts関数に変えてみた
printf("コメントは /* と */ で挟む\n");
*/
("コメントは /* と */ で挟む");
puts}
/*
と */
は、複数行にまたがってコメントにできますが、この問題のような現象に引っ掛かることがよくあります。
(
の直後、)
の直前に空白を入れない)return 0;
を削除(C言語編全体でのコードの統一)第8章から練習問題⑫を移動してきて、練習問題③とした。
全面的に文章を見直し、修正を行った。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |