『情報システム用米国規格プログラミング言語 C (ANSI ISO/IEC 9899:1990)』には、C 言語で記述されたプログラムの構文と解釈が規定されています。
この付録では、それらの動作を詳しく説明します。各項は ISO/IEC 9899:1990 規格 (付録 G ) そのものと簡単に比較できるようになっています。
ANSI 規格と同様の文を用いて各動作を説明しています。
各動作の説明の前に ANSI 規格で対応する節番号を付けています。
エラーメッセージは次の書式です。
ファイル名、line 行番号:メッセージ
警告メッセージは次の書式です。
ファイル名、line 行番号:警告メッセージ
ファイル名とはエラーまたは警告があったファイルの名前です
行番号とはエラーまたは警告が検出された行の番号です
メッセージとは診断メッセージです
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 とみなされます (SPARC) (x86)。
(6.1.2.5) 整数の型の表現と値について
表 B-1 整数の表現と値
整数がより短い符号付き整数に変換される場合は、長い方の整数の下位ビットが短い方の符号付き整数に複写されます。結果は負になることがあります。
符号なし整数が同サイズの符号付き整数に変換される場合は、符号なし整数の下位ビットが符号付き整数に複写されます。結果は負になることがあります。
ビット単位演算を符号付きの型に適用すると、符号ビットを含むオペランドのビット単位演算となります。その結果の各ビットは、両オペランドの対応するビットが設定されていた場合にのみ設定されます。
結果は被除数と同じ符号になります。たとえば、-23/4 の剰余は -3 となります。
右シフトの結果は符号付きの右シフトとなります。
float |
|
ビット数 |
32 |
最小値 |
1.17549435E-38 |
最大値 |
3.40282347E+38 |
イプシロン |
1.19209290E-07 |
double |
|
ビット数 |
64 |
最小値 |
2.2250738585072014E-308 |
最大値 |
1.7976931348623157E+308 |
イプシロン |
2.2204460492503131E-16 |
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 です。
-Xarch=v9 では、unsigned long です。
ポインタおよび int、long、unsigned int、unsigned long 型の値ではビットパターンは変わりません。
stddef.h において定義された int 型です。
-Xarch=v9 では、long 型です。
有効なレジスタ宣言の数は使用パターンおよび各関数における定義に依存し、割り当て可能なレジスタ数に制限されます。コンパイラやオプティマイザは、レジスタ宣言に従う必要はありません。
共用体のメンバーに記憶されているビットパターンがアクセスされ、アクセスしたメンバーの型に従って値が解釈されます。
各要素が適切な境界上に並ぶように、構造体のメンバーが自動的に埋め込まれます。
構造体自身の整列条件はそのメンバーの整列条件と同一です。たとえば、char 型だけの struct は整列の制限はありませんが、double 型を含む struct は 8 バイトの境界上に並びます。
unsigned int とみなされます。
ビットフィールドは、記憶装置内で高位から低位の順に割り当てられます。
ビットフィールドは記憶装置の境界を越えることはありません。
int 型です。
オブジェクト名を参照するたびに、そのオブジェクトへアクセスされます。
コンパイラによる制限はありません。
コンパイラによる制限はありません。
前処理命令内の文字定数は他の式のものと同一の数値を持ちます。
この場合の文字定数は負の値を取ることがあります (SPARC) (x86)。
最初に、ファイル名が < > によって区切られたファイルを、-I オプションによって指定されたディレクトリの中で検索します。次に、標準ディレクトリの中を検索します。異なるデフォルト位置を指定するのに -YI オプションが使用されていない限り、標準ディレクトリは /usr/include です。
最初に、ファイル名が引用符によって区切られたファイルを、#include 文のあるソースファイルのディレクトリ中で検索します。次に、-I オプションによって指定されたディレクトリの中を検索し、最後に標準ディレクトリの中を検索します。
< > や二重引用符で囲まれたファイル名が '/' で始まっている場合は、そのファイル名はルートディレクトリで始まるパス名であると解釈されます。このファイルの検索はルートディレクトリの中においてのみ開始されます。
インクルード命令の引用符付きのファイル名はサポートされます。
ソースファイルの文字は対応する ASCII の値に配置されます。
次に示すプラグマがサポートされています。詳細は、「プラグマ」を参照してください。
align <整数> (<変数>[,<変数>])
does_not_read_global_data (<関数>[,<関数>])
does_not_return (<関数>[,<関数>])
does_not_write_global_data (<関数>[,<関数>])
error_messages (on|off|default, <タグ>... <タグ>)
fini (<関数 1>[, <関数 2>..., <関数 n>])
ident (<文字列>)
init (<関数 1>[, <関数 2>..., <関数 n>])
inline (<関数>[,<関数>])
int_to_unsigned (<関数>)
MP serial_loop
MP serial_loop_nested
MP taskloop
no_inline (<関数>[,<関数>])
nomemorydepend
no_side_effect (<関数>)
opt_level (<関数>[,<関数>])
pack(n)
pipeloop(n)
rarely_called (<関数>[,<関数>])
redefine_extname <旧外部参照名> <新外部参照名>
returns_new_memory (<関数>[,<関数>])
unknown_control_flow (<名前>[,<名前>]...)
unroll (<展開関数>)
weak (<シンボル 1> [=< シンボル 2>])
これらのマクロは常に使用できます。
null は 0 になります。
診断は次のようになります。
Assertion failed: <文>. file <ファイル名>, line <番号>
<文> は表明に失敗した文です
<ファイル名> は障害を持ったファイルの名前です
<番号> は障害が発生した行の番号です
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 引数が返されます。
表 B-6 に signal 関数が認識する各シグナルの意味を示します。
表 B-6 signal シグナルの意味
シグナル |
No. |
デフォルト |
イベント |
---|---|---|---|
SIGHUP | 1 |
終了 |
ハングアップ |
SIGINT | 2 |
終了 |
割り込み |
SIGQUIT | 3 |
コア |
終了 |
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); 相当のものは、常に実行されます。
SIGILL では、デフォルト処理はリセットされません。
最終行を改行文字で終了する必要はありません。
ストリームが読み込まれるときにはすべての文字が表示されます。
バイナリストリームには null 文字を追加しません。
ファイル位置指示子は最初にファイルの終わりに置かれます。
ハードウェアの命令がない限り、テキストストリームへの書き込みによって書き込み点以降の関連ファイルが切り捨てられることはありません。
標準エラーストリーム (stderr) を除く出力ストリームは、デフォルトでは出力がファイルの場合にはバッファリングされ、出力が端末の場合にはラインバッファリングされます。標準エラー出力ストリーム (stderr) はデフォルトではバッファリングされません。
バッファリングされた出力ストリームは多くの文字を保存し、その文字をブロックとして書き込みます。バッファリングされなかった出力ストリームは宛先ファイルあるいは端末に迅速に書き込めるように情報の待ち行列を作ります。ラインバッファリングされた出力は、その行が完了するまで (改行文字が要求されるまで) 出力の各行の待ち行列を作ります。
ディレクトリエントリを持つという意味ではゼロ長ファイルは存在します。
有効なファイル名は 1 から 1,023 文字までの長さで、NULL 文字とスラッシュ (/) 以外のすべての文字を使用することができます。
同一のファイルを何回も開くことができます。
ファイルを閉じる最後の呼び出しによりファイルが削除されます。すでに除去されたファイルをプログラムが開くことはできません。
そのようなファイルがあれば削除され、新しいファイルが元のファイルの上に書き込まれます。
%p の出力は %x と等しくなります。
%p の入力は %x と等しくなります。
'-' 文字は包含的範囲を意味します。すなわち、[0-9] は [0123456789] に等しくなります。
現地時間帯は環境変数 TZ で設定します。
clock 関数の経過時間はプログラム実行開始時を原点とする時間経過として表現されます。
ホスト環境については以下のようなロケール固有の性質があります。
ロケール依存です。C ロケールでは、文字セットに拡張はありません。
常に左から右に印刷されます。
ロケール依存です。C ロケールでは、10 進小数点はピリオド ( . ) です。
表 B-4 を参照してください。
ロケール依存です。C ロケールでは、照合順序は ASCII の照合シーケンスと同じです。
ロケール依存です。C ロケールでの月の名前は次のとおりです。
表 B-7 月の名前January | May | September |
February | June | October |
March | July | November |
April | August | December |
曜日の名前は次のとおりです。
表 B-8 曜日の名前と省略名
曜日名 |
省略名 |
||
Sunday | Thursday | Sun | Thu |
Monday | Friday | Mon | Fri |
Tuesday | Saturday | Tue | Sat |
Wednesday | Wed |
時間の書式は次のとおりです。
%H:%M:%S
日付の書式は次のとおりです。
%m/%d/%y
午前/午後を指定する書式は、次のとおりです。
AM
PM