Last Update 2023/06/29
テスト概要
ラベル
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
GCC-12.2.0
GNU C Library 2.36
GNU Binutils 2.39
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。