「C言語/中級者向けの話題」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎ホスト環境: C11に一対一に対応するよう構成。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
Fix ref
タグ: 2017年版ソースエディター
180 行
 
==== ホスト環境 ====
ホスト環境を提供する必要はありませんが、存在する場合は以下の仕様に準拠する必要があります<ref name="jtc1-sc22-wg14-n1570-5.1.2.2.2">{{cite book
| url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
| title= C11: WG14/N1570 Committee Draft — April 12、 2011 ISO/IEC 9899:201x
300 行
<syntaxhighlight lang="C">
//例 関数へのポインタの引数
int main(void)
#include <stdio.h>
 
void func1()
{
func2(func1);
printf("func1()が呼び出されました。\n");
}
#include <stdio.h>
 
void func1() { printf("func1()が呼び出されました。\n"); }
void func2(void (*func)())
 
{
void func2(void (*func)()) {
printf("func2()が呼び出されました。\n");
(*func)();
}
 
int main(void) {
 
func2(func1);
int main(void)
{
func2(func1);
}
</syntaxhighlight>
324 ⟶ 322行目:
#include <stdio.h>
 
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
{
int mul(int a, int b) { return a+ * b; }
int div(int a, int b) {
if (b == 0) {
printf("0で割ることはできません。\n");
return 0;
} else {
return a / b;
}
}
 
int submain(intvoid) a, int b){
int i, j;
{
int arithmetic;
return a-b;
int (*func[])(int a, int b) = {add, sub, mul, div};
}
printf("2つの整数をスペースで区切って入力してください。:");
 
int mul scanf(int"%d a%d", int&i, b&j);
printf("計算方法を入力してください(0=加法、1=減法、2=乗法、3=除法)。:");
{
scanf("%d", &arithmetic);
return a*b;
if (0 <= arithmetic && arithmetic <= 3)
}
printf("答えは%d。\n", (*func[arithmetic])(i, j));
 
int div(int a, int b)
{
if (b==0){
printf("0で割ることはできません。\n");
return 0;
}
else{
return a/b;
}
}
 
int main(void)
{
int i,j;
int arithmetic;
int (*func[])(int a, int b)={add, sub, mul, div};
printf("2つの整数をスペースで区切って入力してください。:");
scanf("%d %d", &i, &j);
printf("計算方法を入力してください(0=加法、1=減法、2=乗法、3=除法)。:");
scanf("%d", &arithmetic);
if (0<=arithmetic&&arithmetic<=3)
printf("答えは%d。\n", (*func[arithmetic])(i,j));
}
</syntaxhighlight>
383 ⟶ 366行目:
関数を呼び出したときの状態を復元し、
処理を続ける。<ref>矢沢久雄、原田英生『日経 BP パソコンベストムック C言語とC++がわかる本』日経ソフトウェア、2013年5月15日発行、112項</ref>
 
 
再帰を行うには、その関数がリエントラントである必要がある。
394 ⟶ 376行目:
int factorial(int n);
 
int main(void) {
int i;
{
printf("整数を入力してください:");
int i;
scanf("%d", &i);
printf("整数を入力してください:");
printf("%dの階乗は%dです。", i, factorial(i));
scanf("%d", &i);
printf("%dの階乗は%dです。", i, factorial(i));
}
 
int factorial(int n) {
if (n == 0)
{
if(n==0) return 1;
return factorial(n - 1) * n;
}
</syntaxhighlight>
430 ⟶ 411行目:
その名前でアクセスできる。
 
ビットフィールドは、構造体の型枠を宣言する時メンバとして次のように記述する。
構造体の型枠を宣言する時、
メンバとして次のように記述する。
<syntaxhighlight lang="C">
データ型 メンバ名:サイズ;
438 ⟶ 417行目:
 
データ型は、(signed) intまたはunsigned intを指定する。
(signed) intを指定すると、上位ビットが符号として扱われる。
上位ビットが符号として扱われる。
メンバ名とサイズとを「:(コロン)」で区切る。
サイズはそのメンバを何ビットで表すかを指定する。
 
;ビットフィールド:<syntaxhighlight lang="C">
//例 ビットフィールド
#include <stdio.h>
 
int main(void) {
struct sbits {
{
unsigned char bit8 : 1;
struct sbits
unsigned char bit7 : 1;
{
unsigned char bit8bit6 : 1;
unsigned char bit7bit5 : 1;
unsigned char bit6bit4 : 1;
unsigned char bit5bit3 : 1;
unsigned char bit4bit2 : 1;
unsigned char bit3bit1 : 1;
} bits;
unsigned char bit2:1;
unsigned char bit1:1;
}bits;
 
bits.bit1 = 1;
bits.bit2 = 0;
bits.bit3 = 1;
bits.bit4 = 0;
bits.bit5 = 1;
bits.bit6 = 0;
bits.bit7 = 1;
bits.bit8 = 0;
 
printf("bitsのメンバの値は、%d %d %d %d %d %d %d %dです。\n", bits.bit1,
bits.bit1, bits.bit2, bits.bit3, bits.bit4, bits.bit5, bits.bit6, bits.bit7,
bits.bit8);
printf("bitsのサイズは、%dです。\n", sizeof(bits));
}
</syntaxhighlight>
;結果:<syntaxhighlight lang="text">
bitsのメンバの値は、1 0 1 0 1 0 1 0です。
bitsのサイズは、1です。
</syntaxhighlight>
 
上の例では、0か1かの値を持つ1ビットの8つのビットフィールドをもつbits構造体を宣言し各ビットフィールドに値を代入しその値を表示している。
上の例では、
なお、unsigned char型をビットフィールドに使えるかはコンパイラによる。
0か1かの値を持つ1ビットの、
8つのビットフィールドをもつ、
bits構造体を宣言し、
各ビットフィールドに値を代入し、
その値を表示している。
なお、unsigned char型をビットフィールドに使えるかは、コンパイラによる。
 
== 脚 ==
<references />