Loose-Info.com
Last Update 2023/06/29
TOP - 各種テスト - C言語 - 文

テスト概要

ラベル
ブロック文
空(null)文
if文
switch文
while文
do文
for文
goto文
continue文
break文
return文


ラベル


sample.c
#include <stdio.h> #include <stdlib.h> int main(void) { int flg = 0; /* ラベル label_0 */ label_0: if (flg == 1) { /* goto文によるラベル label_1 へのジャンプ */ goto label_1; } printf("(1) "); if (flg == 2) { /* goto文によるラベル label_2 へのジャンプ */ goto label_2; } printf("(2) "); if (flg >= 3) { /* goto文によるラベル label_3 へのジャンプ */ goto label_3; } /* ラベル label_1 */ label_1: printf("(3) "); /* ラベル label_2 */ label_2: switch (flg) { /* switch文 caseラベル */ case 0: printf("(case 0) "); break; /* switch文 caseラベル */ case 1: printf("(case 1) "); break; /* switch文 defaultラベル */ default: printf("(case default) "); } flg++; /* goto文によるラベル label_0 へのジャンプ */ goto label_0; /* ラベル label_3 */ label_3: printf("end\n"); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out (1) (2) (3) (case 0) (3) (case 1) (1) (case default) (1) (2) end

ブロック文


sample.c
#include <stdio.h> #include <stdlib.h> int main(void) { int i = 0; int j = 100; for (i=0; i<3; i++) { /* ブロック文(1) */ int j = i * 3; /* ブロックスコープ変数 */ printf("ブロック(1) j = %d\n", j); } if (i >= 2) { /* ブロック文(2) */ int j = i * 5; /* ブロックスコープ変数 */ printf("ブロック(2) j = %d\n", j); } { /* ブロック文(3) */ j = j + 100; /* スコープはブロック外 */ printf("ブロック(3) j = %d\n", j); } { /* ブロック文(4) */ int j = i * 10; /* ブロックスコープ変数 */ printf("ブロック(4) j = %d\n", j); } printf("ブロック外 j = %d\n", j); return EXIT_SUCCESS; }

実行結果
bash-5.1$ gcc -Wall sample.c bash-5.1$ ./a.out ブロック(1) j = 0 ブロック(1) j = 3 ブロック(1) j = 6 ブロック(2) j = 15 ブロック(3) j = 200 <--- ブロック外の「j」の値を使用 ブロック(4) j = 30 ブロック外 j = 200 <--- ブロック外の「j」の値を使用

空(null)文


sample.c
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char *p; if (argc > 1) { p = argv[1]; while (*p != '\0' ? fputc(*(p++)+1 , stdout) : 0) ; /* 空(null)文 */ } printf("\n"); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out 123 234 $ ./a.out ABC BCD $ ./a.out abc bcd

if文


sample.c
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { /* 引数の個数による分岐 */ if (argc > 1) { /* 引数が有る場合に実行されるブロック */ int i = atoi(argv[1]); /* 関数atoi()の結果による分岐 */ if (i != 0) { /* 関数atoi()の結果が0以外の数値の場合に実行されるブロック */ printf("数値もしくは数値で始まる : 変換結果 ---> %d\n", i); } else { /* 関数atoi()の結果が0の場合に実行されるブロック */ printf("数値以外で始まる : 引数 ---> %s\n", argv[1]); } } else { /* 引数が無い場合に実行されるブロック */ puts("引数無し"); } return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out a 数値以外で始まる : 引数 ---> a $ ./a.out abc123 数値以外で始まる : 引数 ---> abc123 $ ./a.out 123abc 数値もしくは数値で始まる : 変換結果 ---> 123 $ ./a.out 123456 数値もしくは数値で始まる : 変換結果 ---> 123456

switch文


sample.c
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { if (argc > 1) { for (int i=0; i<strlen(argv[1]); i++) { char c = argv[1][i]; /* switch文による分岐処理 */ switch (c) { /* 文字cが「-」の場合は「+」に書き換え */ case '-': fputc('+', stdout); break; /* 文字cが「+」の場合は「-」に書き換え */ case '+': fputc('-', stdout); break; /* 文字cが「*」「/」「%」の場合は「_」に書き換え */ case '*': case '/': case '%': fputc('_', stdout); break; /* その他の場合はそのまま出力 */ default: fputc(c, stdout); } } fputc('\n', stdout); } else { puts("引数無し"); } return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out 123-456 123+456 $ ./a.out 123*456 123_456 $ ./a.out 123//abc 123__abc $ ./a.out -123*+3-zzz +123_-3+zzz

while文


sample.c
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { int i, j; if (argc > 1) { i = 0; /* 制御式がtrueである限りループ */ while (i++ < atoi(argv[1])) { printf("%02d\n", i); if (argc > 2) { j = 0; /* 無限ループ */ while (1) { if (++j > atoi(argv[2])) { break; } printf(" %02d\n", j); } } } } else { puts("引数無し"); } return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out 3 3 01 01 02 03 02 01 02 03 03 01 02 03

do文


sample.c
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { int i; if (argc > 1) { i = 0; /* ループ開始 */ do { printf("%02d\n", i); /* 制御式がtrueである限りループ */ } while (i++ < atoi(argv[1])); } else { puts("引数無し"); } return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out 3 00 01 02 03

for文


sample.c
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { int i; if (argc > 1) { /* iの初期化 ; 制御式 ; iの加算 */ for (i=0; i < atoi(argv[1]); i++) { printf("%02d\n", i); if (argc > 2) { /* jの宣言・初期化 ; 制御式 ; jの加算 */ for (int j=0; j < atoi(argv[2]); j++) { printf(" %02d\n", j); } } } i = 100; /* 無限ループ */ for (;;) { printf("%04d\n", i); if (++i > atoi(argv[1]) + 100) { break; } } } else { puts("引数無し"); } return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out 2 4 00 00 01 02 03 01 00 01 02 03 0100 0101 0102

goto文


sample.c
#include <stdio.h> #include <stdlib.h> int main(void) { for (int i=0; i<4; i++) { printf("%d\n", i); if (i == 0) { /* ループ内でのジャンプ */ goto label1; } if (i == 1) { /* ループ内でのジャンプ */ goto label2; } if (i == 2) { /* ループ外へのジャンプ */ goto label3; } /* ループ内のラベル*/ label1: printf("label1\n"); /* ループ内のラベル*/ label2: printf("label2\n"); } /* ループ外のラベル*/ label3: return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out 0 label1 label2 1 label2 2

continue文


sample.c
#include <stdio.h> #include <stdlib.h> int main(void) { for (int i=0; i<4; i++) { printf("%d\n", i); if (i == 0) { /* (1)~(3)は表示せずに次のループへジャンプ */ continue; } printf("(1)\n"); if (i == 1) { /* (2)、(3)は表示せずに次のループへジャンプ */ continue; } printf("(2)\n"); if (i == 2) { /* (3)は表示せずに次のループへジャンプ */ continue; } printf("(3)\n"); } return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out 0 1 (1) 2 (1) (2) 3 (1) (2) (3)

break文


sample.c
#include <stdio.h> #include <stdlib.h> int main(void) { int i; for (i=0; i<3; i++) { if (i == 1) { printf("for break\n"); /* for文終了へ */ break; } printf("for %d\n", i); } i = 0; while (i++ < 3) { if (i == 2) { printf("while break\n"); /* while文終了へ */ break; } printf("while %d\n", i); } switch (i) { case 1: printf("switch break\n"); /* switch文終了へ */ break; default: printf("switch default\n"); } return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out for 0 for break while 1 while break switch default

return文


sample.c
#include <stdio.h> #include <stdlib.h> void func1(void) { printf("func1\n"); /* 型voidの関数のため式を伴わないreturn文(省略可) */ return; } int func2(void) { /* int型の値を返すreturn文 */ return 0; } int func3(int x, int y) { printf("func3\n"); /* int型の式を伴うreturn文 */ return x + y; } int main(void) { func1(); printf("func2() = %d\n", func2()); printf("func3() = %d\n", func3(1, 2)); /* int型の値を返すreturn文 */ return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out func1 func2() = 0 func3 func3() = 3

実行環境

GNU bash, version 5.1.16
GCC-12.2.0
GNU C Library 2.36
GNU Binutils 2.39


コード例・出力内容中の表記

・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。