『Programming Language - C (ISO/IEC 9899:1999)』規格には、C 言語で記述されたプログラムの構文と解釈が規定されています。この付録では、それらの動作を詳しく説明します。各項は ISO/IEC 9899:1990 規格そのものと簡単に比較できるようになっています。日本の対応規格は、JIS X 3010 - 1993 です。
ISO 規格と同様の文を用いて各動作を説明しています。
各動作の説明の前に ISO 規格で対応するセクション番号を付けています。
括弧内の数は、ISO/IEC 9899/1990 規格のセクション番号に対応しています。
エラーメッセージは次の書式です。
filename, line line number: message
警告メッセージは次の書式です。
filename, line line number: warning message
ここで
ファイル名とはエラーまたは警告があったファイルの名前です
行番号とはエラーまたは警告が検出された行の番号です
メッセージとは診断メッセージです
| int main (int argc, char *argv[])
{
....
} | 
argc はプログラムの呼び出しに伴うコマンド行引数の数です。シェルによって展開されたあとは、argc は必ず 1 以上、つまりプログラム名が 1 つ以上になります。
argv はコマンド行引数へのポインタ配列です。
対話型デバイスにはシステムライブラリコールの isatty() が 0 以外の値を返します。
最初の 1,023 文字が有意です。識別子は大文字と小文字を別の文字として扱います。
最初の 1,023 文字が有意です。識別子は大文字と小文字を別の文字として扱います。
どちらの文字セットも ASCII 文字セットやロケール固有の拡張文字と同一です。
シフト状態はありません。
ASCII 部分では、1 文字に 8 ビットです。ロケール固有の拡張文字部分では、ロケール固有の 8 ビットの倍数です。
ASCII 部分では、配置はソース文字と実行文字と同様です。
右端の文字が示す数値です。たとえば、 ’\q’ は ’q’ に等しくなります。このようなエスケープシーケンスが発生すると警告が発行されます。
エスケープシーケンスの発生しない複数バイト文字セットの値は、各文字の示す数値から派生しています。
有効なロケールは LC_ALL、LC_CTYPE、または LANG 環境変数のいずれかで指定されたものです。
char は、signed char とみなされます。
| 整数 | ビット数 | 最小値 | 最大値 | 
|---|---|---|---|
| char | 8 | -128 | 127 | 
| signed char | 8 | -128 | 127 | 
| unsigned char | 8 | 0 | 255 | 
| short | 16 | -32768 | 32767 | 
| signed short | 16 | -32768 | 32767 | 
| unsigned short | 16 | 0 | 65535 | 
| int | 32 | -2147483648 | 2147483647 | 
| signed int | 32 | -2147483648 | 2147483647 | 
| unsigned int | 32 | 0 | 4294967295 | 
| long -m32 | 32 | -2147483648 | 2147483647 | 
| long -m64 | 64 | -9223372036854775808 | 9223372036854775807 | 
| signed long -m32 | 32 | -2147483648 | 2147483647 | 
| signed long -m64 | 64 | -9223372036854775808 | 9223372036854775807 | 
| unsigned long -m32 | 32 | 0 | 4294967295 | 
| unsigned long -m64 | 64 | 0 | 18446744073709551615 | 
| long long | 64 | -9223372036854775808 | 9223372036854775807 | 
| 64 | -9223372036854775808 | 9223372036854775807 | |
| unsigned long long | 64 | 0 | 18446744073709551615 | 
整数がより短い signed 整数に変換される場合は、長い方の整数の下位ビットが短い方の signed 整数に複写されます。結果は負になることがあります。
符号なし整数が同サイズの signed 整数に変換される場合は、unsigned 整数の下位ビットが signed 整数に複写されます。結果は負になることがあります。
ビット単位演算を signed の型に適用すると、sign ビットを含むオペランドのビット単位演算となります。その結果の各ビットは、両オペランドの対応するビットが設定されていた場合にのみ設定されます。
結果は被除数と同じ符号になります。たとえば、-23/4 の剰余は -3 となります。
| float | 
 | 
| ビット数 | 32 | 
| 最小値 | 1.17549435E-38 | 
| 最大値 | 3.40282347E+38 | 
| イプシロン | 1.19209290E-07 | 
表 E–3 double の値
| double | 
 | 
| ビット数 | 64 | 
| 最小値 | 2.2250738585072014E-308 | 
| 最大値 | 1.7976931348623157E+308 | 
| イプシロン | 2.2204460492503131E-16 | 
表 E–4 long double の値
| long double | 
 | 
| ビット数 | 128 (SPARC) 80 (x86) | 
| 最小値 | 3.362103143112093506262677817321752603E-4932 (SPARC) 3.3621031431120935062627E-4932 (x86) | 
| 最大値 | 1.189731495357231765085759326628007016E+4932 (SPARC) 1.1897314953572317650213E4932 (x86) | 
| イプシロン | 1.925929944387235853055977942584927319E-34 (SPARC) 1.0842021724855044340075E-19 (x86) | 
数値は元の値の近似値に丸められます。
数値は元の値の近似値に丸められます。
stddef.h において定義されている unsigned int です (—m32 の場合)。
unsigned long (-m64 の場合)
ポインタおよび int、long、unsigned int、unsigned long 型の値ではビットパターンは変わりません。
stddef.h において定義されている int です (—m32 の場合)。
long (-m64 の場合)
有効なレジスタ宣言の数は使用パターンおよび各関数における定義に依存し、割り当て可能なレジスタ数に制限されます。コンパイラやオプティマイザは、レジスタ宣言に従う必要はありません。
共用体のメンバーに記憶されているビットパターンがアクセスされ、アクセスしたメンバーの型に従って値が解釈されます。
| 種類 | 整合の境界 | バイト境界 | 
|---|---|---|
| char と _Bool | バイト | 1 | 
| short | ハーフワード | 2 | 
| int | ワード | 4 | 
| long -m32 | ワード | 4 | 
| long -m64 | ダブルワード | 8 | 
| long long -m32 | ダブルワード (SPARC) ワード (x86) | 8 (SPARC) 4 (x86) | 
| long long -m64 | ダブルワード | 8 | 
| float | ワード | 4 | 
| double -m32 | ダブルワード (SPARC) ワード (x86) | 8 (SPARC) 4 (x86) | 
| double -m64 | ダブルワード | 8 | 
| long double -m32 | ダブルワード (SPARC) ワード (x86) | 8 (SPARC) 4 (x86) | 
| long double -m64 | クワドワード | 16 | 
| pointer -m32 | ワード | 4 | 
| pointer -m64 | クワドワード | 8 | 
| float _Complex | ワード | 4 | 
| double _Complex -m32 | ダブルワード (SPARC) ワード (x86) | 8 (SPARC) 4 (x86) | 
| double _Complex -m64 | ダブルワード | 8 | 
| long double _Complex -m32 | ダブルワード (SPARC) ワード (x86) | 8 (SPARC) 4 (x86) | 
| long double _Complex -m64 | クワドワード | 16 | 
| float _Imaginary | ワード | 4 | 
| double _Imaginary -m32 | ダブルワード (SPARC) ワード (x86) | 8 (SPARC) 4 (x86) | 
| double _Imaginary -m64 | ダブルワード | 8 | 
| long double _Imaginary -m32 | ダブルワード (SPARC) ワード (x86) | 8 (SPARC) 4 (x86) | 
| long double _Imaginary -m64 | ダブルワード | 16 | 
各要素が適切な境界上に並ぶように、構造体のメンバーが自動的に埋め込まれます。
構造体自身の整列条件はそのメンバーの整列条件と同一です。たとえば、chars 型だけの struct は整列の制限がありませんが、—m64 を使用してコンパイルされた double 型を含む struct は 8 バイトの境界上に並びます。
unsigned int とみなされます。
ビットフィールドは、記憶装置内で高位から低位の順に割り当てられます。
ビットフィールドは記憶装置の境界を越えません。
int 型です。
オブジェクト名を参照するたびに、そのオブジェクトへアクセスされます。
コンパイラによる制限はありません。
コンパイラによる制限はありません。
前処理命令内の文字定数はほかの式のものと同一の数値を持ちます。
この場合の文字定数は負の値を取ることがあります。
最初に、ファイル名が < > によって区切られたファイルを、-I オプションによって指定されたディレクトリの中で検索します。次に、標準ディレクトリの中を検索します。異なるデフォルト位置を指定するのに -YI オプションが使用されていないかぎり、標準ディレクトリは /usr/include です。
最初に、ファイル名が引用符によって区切られたファイルを、#include 文のあるソースファイルのディレクトリ内で検索します。次に、-I オプションによって指定されたディレクトリの中を検索し、最後に標準ディレクトリ内を検索します。
< > や二重引用符で囲まれたファイル名が / で始まっている場合は、そのファイル名はルートディレクトリで始まるパス名であると解釈されます。このファイルの検索はルートディレクトリの中でのみ行われます。
include 命令の引用符付きのファイル名はサポートされます。
ソースファイルの文字は対応する ASCII の値に配置されます。
次に示すプラグマがサポートされています。詳細は、「2.11 プラグマ」 を参照してください。
align integer (variable[, variable])
c99 (“implicit” | “no%implicit”)
does_not_read_global_data (funcname [, funcname])
does_not_return (funcname[, funcname])
does_not_write_global_data (funcname[, funcname])
error_messages (on|off|default, tag1[ tag2... tagn])
fini (f1[, f2..., fn])
hdrstop
ident string
init (f1[, f2..., fn])
inline (funcname[, funcname])
int_to_unsigned (funcname)
MP serial_loop
MP serial_loop_nested
MP taskloop
no_inline (funcname[, funcname])
no_warn_missing_parameter_info
nomemorydepend
no_side_effect (funcname[, funcname])
opt_level (funcname[, funcname])
pack(n)
pipeloop(n)
rarely_called (funcname[, funcname])
redefine_extname old_extname new_extname
returns_new_memory (funcname[, funcname])
unknown_control_flow (name[, name])
unroll (unroll_factor)
warn_missing_parameter_info
weak symbol1 [= symbol2]
これらのマクロは常に使用できます。
NULL は 0 になります。
診断は次のようになります。
Assertion failed: statement. file filename, line number
ここで
statement は表明に失敗した文です
filename は障害を持ったファイルの名前です
line number は障害が発生した行の番号です
| isalnum | ASCII 文字の A から Z、a から z、0 から 9 | 
| isalpha | ASCII 文字の A から Z、a から z、およびロケール固有の単一バイト文字 | 
| iscntrl | 0 から 31 までと 127 の値を持つ ASCII 文字 | 
| islower | ASCII 文字の a から z | 
| isprint | ロケール固有の単一バイトの出力可能文字 | 
| isupper | ASCII 文字の A から Z | 
| エラー | 数値演算関数 | コンパイラモード | 
 | 
|---|---|---|---|
| 
 | 
 | -Xs, -Xt | -Xa, -Xc | 
| DOMAIN | acos(|x|>1) | 0.0 | 0.0 | 
| DOMAIN | asin(|x|>1) | 0.0 | 0.0 | 
| DOMAIN | atan2(+-0,+-0) | 0.0 | 0.0 | 
| DOMAIN | y0(0) | -HUGE | -HUGE_VAL | 
| DOMAIN | y0(x<0) | -HUGE | -HUGE_VAL | 
| DOMAIN | y1(0) | -HUGE | -HUGE_VAL | 
| DOMAIN | y1(x<0) | -HUGE | -HUGE_VAL | 
| DOMAIN | yn(n,0) | -HUGE | -HUGE_VAL | 
| DOMAIN | yn(n,x<0) | -HUGE | -HUGE_VAL | 
| DOMAIN | log(x<0) | -HUGE | -HUGE_VAL | 
| DOMAIN | log10(x<0) | -HUGE | -HUGE_VAL | 
| DOMAIN | pow(0,0) | 0.0 | 1.0 | 
| DOMAIN | pow(0,neg) | 0.0 | -HUGE_VAL | 
| DOMAIN | pow(neg,non-integal) | 0.0 | NaN | 
| DOMAIN | sqrt(x<0) | 0.0 | NaN | 
| DOMAIN | fmod(x,0) | x | NaN | 
| DOMAIN | remainder(x,0) | NaN | NaN | 
| DOMAIN | acosh(x<1) | NaN | NaN | 
| DOMAIN | atanh(|x|>1) | NaN | NaN | 
アンダーフローが検出された場合、scalbn を除いた数値演算関数は errno を ERANGE に設定します。
この場合は、ドメインエラーとして第 1 引数が返されます。
次の表に signal 関数が認識する各シグナルの意味を示します。
表 E–8 signal シグナルの意味| シグナル | いいえ。 | デフォルト | イベント | 
|---|---|---|---|
| SIGHUP | 1 | 終了 | ハングアップ | 
| SIGINT | 2 | 終了 | interrupt | 
| SIGQUIT | 3 | コア | quit | 
| SIGILL | 4 | コア | 不当な命令 (捕捉されてもリセットされない) | 
| SIGTRAP | 5 | コア | トレーストラップ (捕捉されてもリセットされない) | 
| SIGIOT | 6 | コア | IOT 命令 | 
| SIGABRT | 6 | コア | 異常終了時に使用 | 
| SIGEMT | 7 | コア | EMT 命令 | 
| SIGFPE | 8 | コア | 浮動小数点の例外 | 
| SIGKILL | 9 | 終了 | 強制終了 (捕捉または無視できない) | 
| SIGBUS | 10 | コア | バスエラー | 
| SIGSEGV | 11 | コア | セグメンテーション違反 | 
| SIGSYS | 12 | コア | システムコールへの引数誤り | 
| SIGPIPE | 13 | 終了 | 読み手のないパイプ上への書き込み | 
| SIGALRM | 14 | 終了 | アラームクロック | 
| SIGTERM | 15 | 終了 | プロセスの終了によるソフトウェアの停止 | 
| SIGUSR1 | 16 | 終了 | ユーザー定義のシグナル 1 | 
| SIGUSR2 | 17 | 終了 | ユーザー定義のシグナル 2 | 
| SIGCLD | 18 | 無視 | 子プロセス状態の変化 | 
| SIGCHLD | 18 | 無視 | 子プロセス状態の変化の別名 | 
| SIGPWR | 19 | 無視 | 電源障害による再起動 | 
| SIGWINCH | 20 | 無視 | ウィンドウサイズの変更 | 
| SIGURG | 21 | 無視 | ソケットの緊急状態 | 
| SIGPOLL | 22 | 終了 | ポーリング可能なイベント発生 | 
| SIGIO | 22 | 終了 | ソケット入出力可能 | 
| SIGSTOP | 23 | 停止 | 停止 (キャッチまたは無視できない) | 
| SIGTSTP | 24 | 停止 | tty より要求されたユーザーストップ | 
| SIGCONT | 25 | 無視 | 停止していたプロセスの継続 | 
| SIGTTIN | 26 | 停止 | バックグラウンド tty の読み込みを試みた | 
| SIGTTOU | 27 | 停止 | バックグラウンド tty の書き込みを試みた | 
| SIGVTALRM | 28 | 終了 | 仮想タイマーの時間切れ | 
| SIGPROF | 29 | 終了 | プロファイリングタイマーの時間切れ | 
| SIGXCPU | 30 | コア | CPU の限界をオーバー | 
| SIGXFSZ | 31 | コア | ファイルサイズの限界をオーバー | 
| SIGWAITINGT | 32 | 無視 | プロセスの LWP がブロックされた | 
上記を参照してください。
signal(sig,SIG_DFL) 相当のものは、常に実行されます。
最終行を改行文字で終了する必要はありません。
ストリームが読み込まれるときにはすべての文字が表示されます。
バイナリストリームには null 文字を追加しません。
ファイル位置指示子は最初にファイルの終わりに置かれます。
ハードウェアの命令がないかぎり、テキストストリームへの書き込みによって書き込み点以降の関連ファイルが切り捨てられることはありません。
標準エラーストリーム (stderr) を除く出力ストリームは、デフォルトでは、出力が ファイルの場合にはバッファリングされ、出力が端末の場合にはラインバッファリングされます。標準エラー出力ストリーム (stderr) は、デフォルトではバッファリングされません。
バッファリングされた出力ストリームは多くの文字を保存し、その文字をブロックとして書き込みます。バッファリングされなかった出力ストリームは宛先ファイルあるいは端末に迅速に書き込めるように情報の待ち行列を作ります。行バッファリングされた出力は、その行が完了するまで (改行文字が要求されるまで) 行単位の出力待ち行列に入れられます。
ディレクトリエントリを持つという意味ではゼロ長ファイルは存在します。
有効なファイル名は 1 から 1,023 文字までの長さで、null 文字とスラッシュ (/) 以外のすべての文字を使用することができます。
同一のファイルを何回も開くことができます。
ファイルを閉じる最後の呼び出しによりファイルが削除されます。すでに除去されたファイルをプログラムが開くことはできません。
そのようなファイルがあれば削除され、新しいファイルが元のファイルの上に書き込まれます。
%p の出力は %x と等しくなります。
%p の入力は %x と等しくなります。
- 文字は包含的範囲を意味します。すなわち、[0-9] は [0123456789] に等しくなります。
clock 関数の経過時間は、プログラム実行開始時を原点とする時間経過として表現されます。
ホスト環境については次のようなロケール固有の性質があります。
ロケール依存です。C ロケールでは、文字セットの拡張はありません。
常に左から右に印刷されます。
ロケール依存です (C ロケールでは、ピリオド「.」)。
「4.3.1」と同義です。
ロケール依存です。C ロケールでは、照合順序は ASCII の照合シーケンスと同じです。
ロケール依存です。C ロケールでの形式を次の表にまとめます。月の名前は次のとおりです。
表 E–9 月の名前| January | May | September | 
| February | June | October | 
| March | July | November | 
| April | August | December | 
曜日の名前は次のとおりです。
表 E–10 曜日の名前と省略名| 曜日名 | 
 | 省略名 | 
 | 
| Sunday | Thursday | Sun | Thu | 
| Monday | Friday | Mon | Fri | 
| Tuesday | Saturday | Tue | Sat | 
| Wednesday | Wed | 
時間の書式は次のとおりです。
%H:%M:%S
日付の書式は次のとおりです。
%m/%d/%y