変数(variable)
定数(constant)
データ型(data type)

データ型型変換

 数の基本的データ型

char1文字、1Byte(8bit)character
int整数integer
float単精度浮動小数点数single-precision floating-point number
double倍精度浮動小数点数double-precision floating-point number

 整数型に適用される修飾子(qualifier)

short少なくとも16bitshortintlong
long少なくとも32bit
signed符号付き$[\,-2^{n-1}, 2^{n-1}-1\,]$
unsigned符号無し$[\,0, 2^n-1\,]$
( $n$はbit数、1Byteは8bit、数の表現に関してはこちら

 void型

 派生型のオブジェクト複雑な型

  上記の基本的な算術型に加えて以下のものもオブジェクトとなる

定数

 定数

定数型基本部分接尾子
int1234なし1234
longl または L1234L
unsignedu または U1234U
double小数点(123.4
または指数部(1e-2
なし123.4
floatf または F123.4F
long doublel または L123.4L
記数法接頭子
10進数なし31
8進数0(ゼロ)037
16進数0xまたは0X0x1F

 文字定数

1重引用符 ' の間に1個の文字(半角カタカナを除く1バイト文字)を書く
<例>
'a', 'B', '3', '!', '\n'(←エスケープシーケンス)
<ダメな例>
'ab'(←2文字以上), 'あ'(←2バイト文字

 エスケープシーケンス

改行LF\n バックスラッシュ\\\
水平タブHT\t 疑問符?\?
垂直タブVT\v 1重引用符'\'
後退BS\b 2重引用符"\"
復帰CR\r 8進数ooo\ooo
改頁FF\f 16進数hh\xhh
ベルBEL\a
文字列の終わりを表すNUL文字'\0'

  ¥(円)と\(バックスラッシュ)

エスケープシーケンスに使われている¥記号は、元々ASCIIコードで\(バックスラッシュ)であった文字コード0x5cに、JISコードで¥を割り当てたため、日本では¥記号になっているが、欧米では\になっている(この説明文では2バイト文字を用いている)

 定数式

定数からのみなる式

 文字列定数

2重引用符 " で囲まれた0個以上の文字の列
<例>
"abc", "Hello World\n", "文字列中の2重引用符は\"で表す"
内部表現では最後にNUL文字'\0'が置かれている
<例>
"あいうえお"(←処理系によっては日本語もOK!)

 列挙定数

値が指定されていない場合は、最後に指定された値から順に1ずつ大きくなる
<例>
enum boolean { NO, YES };
enum month { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };

変数

 変数(variable)は値を入れる箱のようなもので、メモリ(memory)を利用して値を記憶する。 変数は名前(name)、型(data type)、値(value)という属性を持つ。

 変数名

 変数の宣言(変数の性質を告げる)

extern 変数の型 変数名;	/* 外部変数であることの宣言 */

 変数の定義(宣言したことにもなる)

変数の型 変数名;

 変数の初期化(定義と同時に値を設定する)

変数の型 変数名 = 定数式;

 変数と式と代入

int i;
int j = 123;

i = 100;
i = j;
i = i + 200;
 変数や式の値を図示すると 

文字と文字列(Cストリング)

文字はスカラーなので、if( moji == 'a' ) の様に比較できるが、
文字列は配列なので、if( mojiretu == "abc" ) の様には比較できない。
if( !strcmp(mojiretu,"abc") ) の様に標準ライブラリ関数を使う。

配列入門

 同じ型のデータの並びを配列と呼ぶ

 配列の定義

要素の型 配列名[要素の数];

 配列の初期化

要素の型 配列名[要素の数] = { 要素0, 要素1,,, };
char 配列名[要素の数] = 文字列定数;
char 配列名[] = 文字列定数; /* 要素数は省略可 */

 配列の参照

配列名[インデックス]

演算に伴う型変換

 算術演算

+ - * /charshortintlongfloatdouble
charintintintlongfloatdouble
shortintintintlongfloatdouble
intintintintlongfloatdouble
longlonglonglonglongfloatdouble
floatfloatfloatfloatfloatfloatdouble
doubledoubledoubledoubledoubledoubledouble

 ポインタ

ポインタ型 + 整数型その数だけ後ろ要素を指すポインタ
ポインタ型 - 整数型その数だけ前の要素を指すポインタ
ポインタ型 - ポインタ型ポインタに挟まれた要素数を表す整数

 代入演算( = 他)

左辺値 = 
左辺値 op= 

 return文

return ;
return();

 キャスト(cast)演算子

(型名)

 関数の引数の型変換

各データ型の値の範囲を調べよう

 ヒント:処理系に依存する

ASCII文字セット

 char は1Byte(8bit)なので、256種類の値を持つことができる。

 現在、殆どのシステムでASCII文字セットが用いられている。

/* ASCII文字とコードを16進数、10進数で表示する */
#include <stdio.h>

main()
{
	char	c;

	for( c = ' '; c <= '~'; c++ )
	{
		printf("文字:%c 16進数:%2x 10進数:%d\n", c, c, c );
	}
}
/* end of ascii.c */

文字と文字列操作をしてみよう

/* 文字と文字列操作 */
/* 標準ヘッダをインクルードする */
#include <stdio.h>
#include <string.h>

main()
{
	/* 文字配列の定義 */
	char	s[10], d[10];

	printf("改行なし。");
	printf("改行あり。\n");

	printf("文字列の表示方法(その1)\n");
	printf("%s", "文字列の表示方法(その2)\n");
	puts("文字列の表示方法(その3)");

	/* Cの配列のインデックスは0(ゼロ)から始まる */
	s[0] = 'a'; /* 配列の最初の要素に文字「a」を代入する */
	s[1] = 'b';
	s[2] = 'c';
	s[3] = '\0'; /*文字列の最後を表すNUL文字'\0'を代入する */
	puts(s);
	printf("%s\n", s );
	/* 「puts(s)はprintf("%s\n", s )と同じ。」と表示したい */
	printf("puts(s)はprintf(\"%%s\\n\", s )と同じ。\n");
	/* 書式文字列の中で「%」を表すには「%%」と重ねる */

	printf("d = s; と文字列は代入できないから\n");
	printf("strcpy関数を使う。\n");
	strcpy( d, s );
	puts(d);
}
/* end of string.c */
  1. ライブラリ関数 strcpy() について調べてみよう!
  2. abc の代わりに自分の名前をローマ字で(例:DEGUCHI Hiroshi)表示させよう!
    ・配列のサイズを 10 よりも大きくする必要があるかもしれない
  3. printf(文字列);printf("%s", 文字列); は全く同じだろうか?
    文字列の部分の書き方に注意して考えてみよ!
 ・ ・ ・ 略式(このWeb資料での書き方)
 ・ ・ ・ 文字表現(\は¥と同じ)
 ・ ・ ・ 10進整数表現
 ・ ・ ・ 16進整数表現

文字配列の初期化を使ってみよう

/* 文字配列の初期化 */
#include <stdio.h>
#include <string.h>

main()
{
	/* 文字配列の初期化 */
	char	s[10] = "abc";
	char	d[20] = "Hello World\n";
	
	/* s = "def"; とはできない! */
	puts(s);
	puts(d);
	printf("上の文字列の長さ:%d\n", strlen(d) );
}
/* end of string2.c */
  1. ライブラリ関数 strlen() について調べてみよう!
  2. 配列 d の要素(文字)を1個ずつ表示してみよう!
    ・1行に1文字を表示する方法は、 printf("%c\n", 文字 );
    ・配列 d の最初、1文字目(0番目の文字)の場合は、printf("%c\n", d[0] );
    ・配列 d の2文字目(1番目の文字)の場合は、printf("%c\n", d[1] );
  3. for文を用いて実現してみよう!
    ・配列 d の 0から数えて i 番目の文字の表示は、printf("%c\n", d[i] );
  4. 最初に戻って、配列 d を自分の名前(漢字)(例:"出口 弘")で初期化して、そのまま文字列として表示してみよう!
  5. 配列 d がどのように初期化されたのか、1バイト分ずつコード(16進数)で表示してみよう!
    ・配列 di バイト目のコードの表示は、printf("%2x\n", d[i] );
  6. ライブラリ関数 strlen() と同様に文字列の長さを返す関数 int mystrlen(char *s) を作成してみよ!

キーワード(予約語)
autodoubleintstruct
breakelselongswitch
caseenumregistertypedef
charexternreturnunion
constfloatshortunsigned
continueforsignedvoid
defaultgotosizeofvolatile
doifstaticwhile