2010/11/21

C言語の基礎早めくり

「C言語まとめ」に戻る

Release:1.0
Date:November 21, 2010
テスト環境
OS: Ubuntu10.10
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

はじめに

自分用に書いた、C言語の基礎をぱぱっと見れるようにしたものです。
人に見せられるようなものではないのですが、一応メモがわりということで。

■行の継続

\ を使う。
#include <std\
io.h>

■データの終わり

EOFNULL
while ((c=getchar()) != EOF){
      ...
}
とか、
while (gets(st) != NULL){
      ...
}
  • getchar() は入力終了で EOF を返す。
  • get() は入力終了で NULL を返す。
  • fopen はオープン失敗で NULL を返す。

■文字列の内部表現

char str[6] = "HELLO";
これは、内部的には
char str[6] = { 'H','E','L','L','O','\0' };
となっている。
文字列の終わりにはかならず \0 がつくので、文字列を格納するときには
「文字列の長さ + 1」とする。

■文字列リテラルの連結

char ss[] = "ABCD" "1234" "abcd";

printf("%s\n", ss);   /* ABCD1234abcd と出力される  */
printf("aaaa" "bbbb" "\n");   /* aaaabbbb と出力される  */

■コメント

/* コメント開始

C言語のコメント

コメント終わり */

■予約語

Note
autodoubleintstruct
breakelselongswitch
caseenumregistertypedef
charexternreturnunion
constfloatshortunsigned
continueforsignedvoid
defaultgotosizeofvolatile
doifstaticwhile

■関数、変数の名前について

▼使用できる文字
[a-z][A-Z][0-9] と _ (アンダーバー)
▼命名規則
* 先頭文字には英大小文字または _ (アンダーバー)
* 長さは31文字まで。
* 予約後をつかってはいけない。

■空文

for (i=0; i<=10000; i++)
      ;
while (*p1++ = *p2++)
      ;

■定数

▼整数定数
区別説明
8進数先頭に「0」をつけて表記(077など)
10進数通常の10進数と同じ表記(0以外ではじまる)
16進数先頭に「0x」をつけて表記(0x41, 0x1a, 0xAB03など)
▼定数の型を指定する整数定数
区別説明
unsigned 型定数文字 「 u 」 または 「 U 」 を後ろに付ける(12300Uなど)
long 型定数文字 「 l 」 または 「 L 」 を後ろに付ける(0Lなど)
unsigned long 型定数文字 「 ul 」 または 「 UL 」(34UL)
▼浮動小数点定数
区別説明
小数点形式ピリオドを使って表記(12.5, 2.45, .3など)
指数形式「 e 」 または 「 E 」 を使って表記 (3.456e2=345.6, 6.78e-3=0.00678など)
▼定数の方を指定する浮動小数点定数定数
区別説明
float 型定数「 f 」 または 「 F 」 を後ろに付ける(1.4142f, 1.0e-3fなど)
long double 型定数「 l 」 または 「 L 」 を後ろに付ける(10.43L, 5.23e-5Lなど)
▼文字定数
「’ ‘」で囲む。文字コードはASCII。
char = 'a'
▼文字列定数
「” “」で囲む。
char[] = "こんにちは"

■エスケープシーケンス

文字列機能
\aベル文字(内蔵ベルを鳴らす)
\bバックスペース
\f改頁(クリア)
\n改行
\r復帰(同じ行の先頭に戻る)
\t水平タブ
\v垂直タブ
\\\を表示
\'シングルクォーテーション(')を表示
\"ダブルクォーテーション(")を表示
\??を表示(3文字表記対策)
\0NUL(終端文字)
\ooo8進数
\xhh16進数
●16進数の桁数が3桁以上になると、警告・エラーになる問題
printf("\x1b" "3")
文字列結合を使って回避。(「printf(“x1b3”)」ではエラーになる)

■データ型

データ型説明 表現範囲 byte(bit)
char1文字、または256種類の数値を保存-128〜1271(8)
signed char符号付きのchar型文字を保存-128〜1271(8)
unsigned char符号なしのchar型文字を保存0〜2551(8)
データ型説明 表現範囲 byte(bit)
short intint は省略可能。整数を保存する-32768〜327672(16)
signed short int符号付のshort型整数を保存-32768〜327672(16)
unsigned short int符号無しのshort型整数を保存0〜655352(16)
データ型説明 表現範囲 byte(bit)
int整数の保存-2147483648〜21474836474(32)
signed int符号付きのint型整数の保存-2147483648〜21474836474(32)
unsigned int符号無しのint型整数の保存0〜42949672954(32)
データ型説明 表現範囲 byte(bit)
long intlong型整数の保存-2147483648〜21474836474(32)
signed long int符号付きのlong型整数の保存-2147483648〜21474836474(32)
unsigned long int符号無しのlong型整数の保存0〜42949672954(32)
データ型説明 表現範囲 byte(bit)
float浮動小数点を保存。実数型で最も最小約10e-39〜10e374(32)
double浮動小数点を保存。floatよりも大きなサイズを確保する約10e-309〜10e3078(64)
long double浮動小数点を保存。doubleよりも大きなサイズを確保する約10e-4933〜10e493112(96)
※環境によって数値は異なります
sizeof() で調べてみてください。
#include <stdio.h>

int main(void)
{
    int a = 1;
    int b = 0;

    printf("char型のサイズは%dバイトです。\n", sizeof(char));
    printf("signed char型のサイズは%dバイトです。\n", sizeof(signed char));
    printf("unsigned char型のサイズは%dバイトです。\n", sizeof(unsigned char));
    printf("short int型のサイズは%dバイトです。\n", sizeof(short int));
    printf("signed short int型のサイズは%dバイトです。\n", sizeof(signed short int));
    printf("unsigned short int型のサイズは%dバイトです。\n", sizeof(unsigned short int));
    printf("int型のサイズは%dバイトです。\n", sizeof(int));
    printf("signed int型のサイズは%dバイトです。\n", sizeof(signed int));
    printf("unsigned int型のサイズは%dバイトです。\n", sizeof(unsigned int));
    printf("long int型のサイズは%dバイトです。\n", sizeof(long int));
    printf("signed long int型のサイズは%dバイトです。\n", sizeof(signed long int));
    printf("unsigned long int型のサイズは%dバイトです。\n", sizeof(unsigned long int));
    printf("float型のサイズは%dバイトです。\n", sizeof(float));
    printf("double型のサイズは%dバイトです。\n", sizeof(double));
    printf("long double型のサイズは%dバイトです。\n", sizeof(long double));
    printf("変数aのサイズは%dバイトです。\n", sizeof(a));
    printf("式a+bのサイズは%dバイトです。\n", sizeof(a + b));

    return 0;
}

■標準入龍津力関数(コンソール入出力関数)

▼printf()
Note
% フラグ フィールド幅 .精度 変換装飾子 変換指定子
●フラグ(省略可能)
-左詰めで出力する(デフォルトでは右詰め)
+数値の前に + / - の符号を付ける(デフォルトでは - のみ)
空白正数の場合に先頭に空白を出力して負の場合と位置を揃える
0数値出力のときに先頭を0で埋める。ゼロバンディング
#数値データ型に対応する別の出力形式を自動的に付加するようにする

対応する変換指定子により以下のとおり効果が変わる

対応変換指定子#の効果
o8進数のデータの先頭に0を付ける
x, X16進数のデータの先頭に0xまたは0Xを付ける
e, E, f出力に必ず小数点を付ける
g, G同上、さらに小数点に続く0を省略しない
printf("デフォルト[%d]\n", 123);
/* デフォルト[123] */
printf("8スペースを確保する[%8d]\n", 123);
/* 8スペースを確保する[     123] */
printf("左詰め[%-8d]\n", 123);
/* 左詰め[123     ] */
printf("8スペースを確保し0で埋める[%08d]\n", 123);
/* 8スペースを確保し0で埋める[00000123] */
printf("8進数にする[%#o]\n", 123);
/* 8進数にする[0173] */
printf("16進数にする[%#x]\n", 123);
/* 16進数にする[0x7b] */
●精度(省略可能)
数値出力の幅を指定する
*対応する引数の値を数値指定とする
int num = 123; n = 10;
printf("n引数で幅を指定する[%*d]\n", n, num);
/* n引数で幅を指定する[       123] */
●フィールド幅(省略可能)
.数値小数点以下の桁数、または最大表示数値を指定する。

対応する変換指定子により以下のとおり効果が変わる

対応変換指定子効果(n=数値)
d, i, o, u, x, X少なくともn個の数字を書く

数字が足りないときは先頭を0で埋める
e, E, f小数点のあとにn個の数字を書く
g, G有効数字を最大n行とする
s最大表示文字数をnとする
.0小数点以下の数字を表示しない(切り捨て)
.同上
.*対応する引数の値を数値をする
double num = 1.4142;
printf("デフォルト[%f]\n", num);
/* デフォルト[1.414200] */
printf("小数点以下3桁まで表示[%.3f]\n", num);
/* 小数点以下3桁まで表示[1.414] */
char ss[] = "abcdefghij";
printf("最大5文字表示[%.5s]\n", ss);
/* 最大5文字表示[abcde] */
●変換修飾子(省略可能)
h変換指定子がd, i, o, u, x, Xのとき対応する引数がshort型または

unsigned shrot型であることを示す。変換指定子がnのとき対応する引数が

short型へのポインタであることを示す。
l変換指定子がd, i, o, u, x, Xのとき対応する引数がlong型または

unsigned long型であることを示す。以下同文。
L変換指定子がe, E, f, g, Gのとき対応する引数がlong double型

であることを示す。
short int sh = 1234;
printf("short int型を表示する[%hd]\n", sh);
/* short int型を表示する[1234] */

●変換指定子

o8進数で出力する
d, i10進数で出力する
x, X16進数で出力する。xは小文字、Xは大文字で出力
u符号無し10進数で出力する
c文字を出力する
s文字列を出力する
f浮動小数点として出力する(float, double共)。標準の精度は6桁。

変換のとき適切な桁数にするための値の丸めを行う。
e, E指数形式で出力する。eは小文字、Eは大文字で出力。標準の精度は6桁。

g, Gf変換を適切な形式で行う。有効精度以上のときなど。
pポインタとして出力する。表示形式は環境依存。
n%nがくるまでに出力された文字の数を対応するint*型引数に書き込む。
%%自信。%%と書く
double num = 3.14;
printf("適切な桁に丸める[%g]\n", num);
/* 適切な桁に丸める[3.14] */
Note
%c char 1文字を出力する “%c”
%s char * 文字列を出力する “%8s”, “%-10s”
%d int, short 整数を10進で出力する “%-2d”,”%03d”
%u unsigned int, unsigned short 符号なし整数を10進で出力する “%2u”,”%02u”
%o int, short,
unsigned int, unsigned short 整数を8進で出力する “%06o”,”%03o”
%x int, short,
unsigned int, unsigned short 整数を16進で出力する “%04x”
%f float 実数を出力する “%5.2f”
%e float 実数を指数表示で出力する “%5.3e”
%g float 実数を最適な形式で出力する “%g”
%ld long 倍精度整数を10進で出力する “%-10ld”
%lu unsigned long 符号なし倍精度整数を10進で出力する “%10lu”
%lo long, unsigned long 倍精度整数を8進で出力する “%12lo”
%lx long, unsigned long 倍精度整数を16進で出力する “%08lx”
%lf double 倍精度実数を出力する “%8.3lf”

つづく?

詳しくは以下の参考文献を参照。

参考・引用

Note
C言語入門

初心者のためのポイント学習C言語

若葉プログラミング塾 ワンポイントTips
下の本から多用しました。不都合などがありましたら、ご連絡ください。
新・C言語入門 シニア編 (C言語実用マスターシリーズ)(林 晴比古さん)
新・C言語入門 シニア編 (C言語実用マスターシリーズ)

「C言語まとめ」に戻る

0 件のコメント:

コメントを投稿