表紙 / 自作ソフト / 日記 / 宝箱 / サイト情報 / 検索
一般 / 新C言語 / 駄文

プログラミング言語 C の新機能


←前頁へ◎表紙へ次頁へ→
 
 

1. 概略
1.1 はじめに
1.2 新しい予約語
1.3 新しいヘッダファイル
2. C プリプロセッサ
2.1 新しいコメント表記方法
2.2 空引数を許された関数型マクロ呼出し
2.3 可変個数引数を持つマクロ定義
2.4 あらかじめ定義されているマクロ名
2.5 プログラミング言語 C 標準プラグマ
2.6 単項演算子 _Pragma
2.7 プリプロセッサ式における整数型
2.8 文字列定数とワイド文字列定数の結合
3. 字句
3.1 ユニバーサルキャラクタ名
3.2 拡張された識別名使用文字
3.3 浮動小数点定数の 16 進数表記
4. 配列
4.1 可変長配列
4.2 構造体中の 0 長配列メンバ
4.3 配列要素中の記憶/型修飾子
5. 整数型
5.1 _Bool 型
5.2 long long int 型
5.3 long long int 型の定数
5.4 整数除算
6. 複素数型
6.1 _Complex 型
6.2 _Imaginary 型
6.3 複素数に関する四則演算
7. 文法一般
7.1 暗黙の関数宣言
7.2 宣言時の暗黙の型
7.3 前定義識別名 __func__
7.4 enum 宣言での余分なカンマ
7.5 inline 関数定義
7.6 restrict ポインタ
7.7 変数宣言と実行コードの位置関係
7.8 指示付きの初期化子 (Designated Initializer)
7.9 複合リテラル (Compound Literal)
7.10 選択文と反復文のブロック化
8. 標準ライブラリ(拡張)
8.1 ctype.h
8.2 float.h
8.3 math.h
8.4 stdarg.h
8.5 stdio.h
8.6 stdlib.h
8.7 wchar.h
8.8 wctype.h
9. 標準ライブラリ(新規)
9.1 complex.h: 複素数
9.2 fenv.h: 浮動小数点環境
9.3 inttypes.h
9.4 stdbool.h
9.5 stdint.h
9.6 tgmath.h: 型総称数学関数
A. 付録
A.1 strftime 書式指定子
A.2 printf の書式

8. 標準ライブラリ(拡張)
 本章では従来から存在するヘッダファイルに追加されたマクロや関数について説明します。

8.1 ctype.h
 ctype.h ヘッダに新たな関数 isblank が追加されました。

isblank
名前int isblank(int c);
ヘッダctype.h
引数c: 検査したい文字コード
戻値0以外:行の中に置ける空白文字、0:それ以外の文字
解説isspace 関数を使用すると、空白文字の判定をすることができます。しかしながら、isspace は行を分割する文字コードも空白と認識してしまいます。テキスト処理をするアプリケーションにとってはこれが問題になることがあります。isblank はその文字が、行の中に置ける空白の場合、0 以外の値を返します。


8.2 float.h
 float.h に新たに、DECIMAL_DIG と FLT_EVAL_METHOD の二つのマクロが追加されました。

float.h 追加マクロ
マクロ名解説
DECIMAL_DIG浮動小数点型で表現できる最大の10進桁数 (ようするに FLT_DIG, DBL_DIG, LDBL_DIG の最大値)
FLT_EVAL_METHOD実際に浮動小数点演算を行うときの範囲と精度を示す値

float型double型long double型
0FLOATDOUBLELONG_DOUBLE
1DOUBLEDOUBLELONG_DOUBLE
2LONG_DOUBLELONG_DOUBLELONG_DOUBLE
-1確定できない
<-1実装定義

実際の計算は、FLOAT=float 型、DOUBLE=double 型、LONG_DOUBLE=long double 型のもつ範囲と精度で行われる

 例えば、FLT_EVAL_METHOD が 1 の時は、float型 ← float型 + float型 の計算でも、float型 ← (float型)((double型)float型 + (double型)float型) として計算が行われる。計算途中でも浮動小数点型の表現範囲とその精度が異なると、同じ値で同じ計算を行っても結果が異なることがある。


8.3 math.h
 今回、math.h の内容がかなり power up されています。すごいボリュームで書くのが嫌です。新しくマクロ、typedef、関数が追加されたのに加え、ほとんどの関数には double 型、float 型、long double 型を引数として受け取り、結果をその型として返す関数が追加されています。例えば、従来の sin 関数は double sin(double x); しか存在しなかったのが、今回からは、これに加え float sinf(float x);, long double sinl(long double x); のように float 型の関数 xxxxf、long double 型の関数 xxxxl が存在します。まずは、今回は追加された二つの typedef について説明します。
 追加された二つの typedef とは float_t と double_t です。これらの実際の型は float.h で定義されている前回説明した FLT_EVAL_METHOD の値により変化します。具体的には次の通りです。ただし float.h が自動的に include されるわけではないので、以下はそのまま使えるわけではありません。


#if   FLT_EVAL_METHOD==0
typedef float float_t;
typedef double double_t;
#elif FLT_EVAL_METHOD==1
typedef double float_t;
typedef double double_t;
#elif FLT_EVAL_METHOD==2
typedef long double float_t;
typedef long double double_t;
#else
float_t, double_t は実装依存の型
#endif

 math.h に新たなマクロが定義されています。また math.h の include で利用可能になるプラグマとしては以前紹介した
  #pragma STDC FP_CONTRACT on-off-switch
があります。マクロには関数型マクロも定義されています。これは次回説明します。

math.h 追加マクロ
マクロ名解説
HUGE_VAL
HUGE_VALF
HUGE_VALL
範囲エラーが起こったときに返される正の double/float/long double 定数(式)。値を正の無限大としてもよい。HUGE_VALF, HUGE_VALL が今回の追加。HUGE_VAL は以前から存在。
INFINITY正または符号無しの無限大をあらわす float 型の定数(式)に展開される。もしそれができない環境では translation 時にオーバーフローする float 型の正の定数に展開される。
NAN浮動小数点型が非例外発生 (quiet) NaN を実装しているときだけ定義される。非例外発生 (quiet) NaN を表現する float 型の定数(式)に展開される。
FP_INFINITE
FP_NAN
FP_NORMAL
FP_SUBNORMAL
FP_ZERO
浮動小数点の値を分類する、それぞれ一意な整数定数(式)。fpclassify( ) マクロの戻り値に使用される。
FP_FAST_FMA
FP_FAST_FMAF
FP_FAST_FMAL
fma/fmaf/fmal(a,b,c) 関数が普通に a*b+c と計算するより早く(例えばハードウエアで直接に)計算できるとき 1 に定義される。
FP_ILOGB0
FP_ILOGBNAN
ilogb(x)関数の戻り値として使用される整数定数(式)。x が 0 の時は FP_ILOGB0 (INT_MIN か -INT_MAX を値として推奨)、x が NaN の時は FP_ILOGBNAN (INT_MAX か INT_MIN を値として推奨) が返される。

 math.h の新たな関数型マクロについて紹介します。

math.h 追加関数型マクロ
マクロ名解説
fpclassify(x)引数 x が NaN, 無限大, normal, subnormal, 0 かどうかを判定し、結果を、FP_INFINITE, FP_NAN, FP_NORMAL, FP_SUBNORMAL, FP_ZERO として返す。
isfinite(x)x が無限大または NaN でなければ整数非ゼロを返す。
isinf(x)x が正または負の無限大ならば整数非ゼロを返す。
isnan(x)x が NaN ならば整数非ゼロを返す。
isnormal(x)x が normal (fplassify(x) が FP_NORMAL を返す場合) ならば整数非ゼロを返す。
signbit(x)x が 負のとき整数非ゼロを返す。ゼロや無限大、NaN の時も正負の判定を行って値を返す。


math.h 比較関数型マクロ
マクロ名解説
isgreater(x, y)(x) > (y) を返す。ただし x と y が順序付けできないときでも例外を発生しない。
isgreaterequal(x, y)(x) >= (y) を返す。ただし x と y が順序付けできないときでも例外を発生しない。
isless(x, y)(x) < (y) を返す。ただし x と y が順序付けできないときでも例外を発生しない。
islessequal(x, y)(x) <= (y) を返す。ただし x と y が順序付けできないときでも例外を発生しない。
islessgreater(x, y)(x) > (y) || (x) < (y) を返す。ただし x と y が順序付けできないときでも例外を発生しない。
isunordered(x, y)(x) と (y) が順序付けできないとき整数 1、さもなくば整数 0 を返す。
注:
 順序付けできないとは、引数に NaN がある時。具体的には (NaN, 値)、(値, NaN)、(NaN, NaN) の時。
 通常の比較演算子を使った比較では NaN があると不正例外が発生する。これらのマクロを使用時にはいかなる時もそのような例外は発生しない。

 math.h で定義されているほとんどの関数には double 型、float 型、long double 型を引数として受け取り、結果をその型として返す関数が追加されています。例えば、従来の sin 関数は double sin(double x); しか存在しなかったのが、今回からは、これに加え float sinf(float x);, long double sinl(long double x); のように float 型の関数 xxxxf、long double 型の関数 xxxxl が存在します。これに当てはまる math.h に従来から存在している関数は sin/cos/tan / asin/acos/atan/atan2 / sinh/cosh/tanh / exp/log/log10/pow/sqrt / fabs / ceil/floor / fmod/frexp/ldexp があります。今回は、これらの関数の説明は行いません。
 さて、これから新たに math.h に追加された関数を説明します。

逆双曲線関数(arc hyperbolic functions): asinh/acosh/atanh
名前 asinh
doubleasinh(double x);
floatasinhf(float x);
long doubleasinhl(long double x);
acosh
doubleacosh(double x);
floatacoshf(float x);
long doubleacoshl(long double x);
atanh
doubleatanh(double x);
floatatanhf(float x);
long doubleatanhl(long double x);
ヘッダmath.h
引数x: asinh/acosh/atanh の演算に対する引数
  acosh:x が 1 未満の値で domain error
  atanh:[-1,+1]以外だと domain error。x が -1 か +1 の時は range error がおこるかも。
戻値演算結果
  acosh: [0, +∞]の範囲
解説 x で示される値を関数の引数として、それぞれ arc hyperbolic sine/arc hyperbolic cosine/arc hyperbolic tangent の演算を行います。


指数/対数関数(exponential/logarithmic functions)
名前プロトタイプ解説
exp2
doubleexp2(double x);
floatexp2f(float x);
long doubleexp2l(long double x);
2x を計算します。x があまりに大きいと range error の可能性あり。
expm1
doubleexpm1(double x);
floatexpm1f(float x);
long doubleexpm1l(long double x);
ex-1 を計算します。x があまりに大きいと range error の可能性あり。
log2
doublelog2(double x);
floatlog2f(float x);
long doublelog2l(long double x);
log2 x を計算します。x が 0 未満の場合 domain error。x が 0 だと range error の可能性あり。
log1p
doublelog1p(double x);
floatlog1pf(float x);
long doublelog1pl(long double x);
loge (x+1) を計算します。x が -1 未満の場合 domain error。x が -1 だと range error の可能性あり。
logb
doublelogb(double x);
floatlogbf(float x);
long doublelogbl(long double x);
x のべき指数を、浮動小数点形式の符号付き整数として取り出します。x が 0 の場合 domain error または range error の可能性あり。
ilogb
intilogb(double x);
intilogbf(float x);
intilogbl(long double x);
x のべき指数を符号付き int として取り出します。x が 0 だと range error の可能性あり。
x戻り値
0FP_ILOGB0
INT_MAX
NaNFP_ILOGBNAN
(int)logb(x)
scalbn

scalbln
doublescalbn(double x, int n);
floatscalbnf(float x, int n);
long doublescalbnl(long double x, int n);

doublescalbln(double x, long n);
floatscalblnf(float x, long n);
long doublescalblnl(long double x, long n);
x × FLT_RADIXn を計算します。range error の可能性があります。
scalbn は int 型の引数を、scalbln は long int 型の引数を取る点が違います。


べき乗関数(power functions)
名前プロトタイプ解説
cbrt
doublecbrt(double x);
floatcbrtf(float x);
long doublecbrtl(long double x);
3富 を計算します。
hypot
doublehypot(double x, double y);
floathypotf(float x, float y);
long doublehypotl(long double x, long double y);
過度のアンダーフローやオーバーフローなしに、原点からの距離 (x2+y2) を計算します。range error の可能性あり。


エラー/ガンマ関数(error/gamma functions)
名前プロトタイプ解説
erf
doubleerf(double x);
floaterff(float x);
long doubleerfl(long double x);
エラー関数 (error function)
2 x

e-t2 dt
父ホ 0
を計算します。(IE だと正しく表示されません。-t2 → -t2)
erfc
doubleerfc(double x);
floaterfcf(float x);
long doubleerfcl(long double x);
補足(?)エラー関数(complementary error function)
2 

e-t2 dt
父ホ x
を計算します。x が大きすぎると range error の可能性あり。(IE だと正しく表示されません。-t2 → -t2)
tgamma
doubletgamma(double x);
floattgammaf(float x);
long doubletgammal(long double x);
ガンマ関数 Γ(x) を計算します。x が 0 以下の場合 domain error か range error。 x が大きすぎ/小さすぎる場合 range error の可能性あり。
lgamma
doublelgamma(double x);
floatlgammaf(float x);
long doublelgammal(long double x);
loge|Γ(x)| を計算します。x が大きすぎる場合、または 0 以下の場合は range error。


丸め関数(nearest integer functions)
名前プロトタイプ解説
nearbyint
doublenearbyint(double x);
floatnearbyintf(float x);
long doublenearbyintl(long double x);
x を現在の丸め方向にしたがって、浮動小数点形式の整数値に丸めます。inexact(不正確) 例外は発生しません。
rint
doublerint(double x);
floatrintf(float x);
long doublerintl(long double x);
x を現在の丸め方向にしたがって、浮動小数点形式の整数値に丸めます。inexact 例外の発生の可能性あり。
lrint

llrint
longlrint(double x);
longlrintf(float x);
longlrintl(long double x);

long longllrint(double x);
long longllrintf(float x);
long longllrintl(long double x);
x を現在の丸め方向にしたがって、最も近い整数値に丸めます。結果が範囲外の場合は結果は未定義で、range error または domain error が発生する可能性があります。
lrint は戻り値が long、llrint はその long long 版。
round
doubleround(double x);
floatroundf(float x);
long doubleroundl(long double x);
x を現在の丸め方向にかかわらず、中間値(0.5)を基準に 0 から遠い方向へ、浮動小数点形式の整数値に丸めます。
lround

llround
longlround(double x);
longlroundf(float x);
longlroundl(long double x);
long longllround(double x);
long longllroundf(float x);
long longllroundl(long double x);
x を現在の丸め方向にかかわらず、中間値(0.5)を基準に 0 から遠い方向へ、浮動小数点形式の整数値に丸めます。結果が範囲外の場合は結果は未定義で、range error または domain error が発生する可能性があります。
lround は戻り値が long、llround はその long long 版。
trunc
doubletrunc(double x);
floattruncf(float x);
long doubletruncl(long double x);
現在の丸め方向にかかわらず、x をその値より大きくならない方向に、浮動小数点形式の整数値に丸めます。


余り関数(remainder functions)
名前プロトタイプ解説
remainder
doubleremainder(double x, double y);
floatremainderf(float x, float y);
long doubleremainderl(long double x, long double y);
 y が 0 以外のとき定義され、x REM y の結果の値 r を返します。r は r = x - n × y から導かれます。n は x/y を正確に表現するのに最も近い整数値で |n - x/y|=1/2 がいつでも成り立つ偶数です。r が 0 なら符号は x の符号と等しくなります。y が 0 のとき、実装依存で domain error もしくは 0 のどちらかが返ります。
remquo
doubleremquo(double x, double y, int *quo);
floatremquof(float x, float y, int *quo);
long doubleremquol(long double x, long double y, int *quo);
 remainder と同じ。quo には、x/y の符号と、2n(n は 3 以上の実装定義値)を法とする x/y の整数の商を持つ値が入ります。y が 0 のとき、remainder 同様、実装依存で domain error もしくは 0 のどちらかが返ります。この場合 quo は不定となります。


操作関数(manipulation functions)
名前プロトタイプ解説
copysign
doublecopysign(double x, double y);
floatcopysignf(float x, float y);
long doublecopysignl(long double x, long double y);
 x の値と y の符号を持った新しい値を返します。
nan
doublenan(const char *p);
floatnanf(const char *p);
long doublenanl(const char *p);
 (sprintf(buf, "NAN(%s)", p), strtod(buf, NULL)) と同じ、もしくは、もし p の指す先が NAN(...) に対し有効な文字を指していないとき、または空文字列を指していないときは strtod("NAN", NULL) と同じ、非例外発生(quiet) NaN を返す。もし 非例外発生(quiet) NaN をサポートしていなければ 0 を返す。
nextafter
doublenextafter(double x, double y);
floatnextafterf(float x, float y);
long doublenextafterl(long double x, long double y);
 y 方向での x の次に表現可能な値を返す。x と y が等しいときは y を返す。range error の可能性あり。
nexttoward
doublenexttoward(double x, long double y);
floatnexttowardf(float x, long double y);
long doublenexttowardl(long double x, long double y);
 nextafter の第二パラメータ long double 版。


最大/最小/正の差関数(maximum, minimum and positive difference functions)
名前プロトタイプ解説
fmax
doublefmax(double x, double y);
floatfmaxf(float x, float y);
long doublefmaxl(long double x, long double y);
 x と y のうち、大きい方の値を返す。
fmin
doublefmin(double x, double y);
floatfminf(float x, float y);
long doublefminl(long double x, long double y);
 x と y のうち、小さい方の値を返す。
fdim
doublefdim(double x, double y);
floatfdimf(float x, float y);
long doublefdiml(long double x, long double y);
 x > y なら x-y を、それ以外なら +0 を返す。range error の可能性あり。


乗算して加算する関数
名前プロトタイプ解説
fma
doublefma(double x, double y, double z);
floatfmaf(float x, float y, float z);
long doublefmal(long double x, long double y, long double z);
 x * y + z を返す。丸めは FLT_ROUNDS に従って最後に一度だけ行われる。また、FP_FAST_FMA, FP_FAST_FMAF, FP_FAST_FMAL が定義されていると、それぞれ対応する関数で x * y + z と個別に計算するより高速に計算できる(例えばハードウエアでの一命令による直接計算)。


8.4 stdarg.h
 stdarg.h ヘッダに新たなマクロが追加されました。それは va_copy です。

va_copy
名前void va_copy(va_list dst, va_list src);
ヘッダstdarg.h
引数src:コピー元
dst:コピー先
戻値なし
解説va_start で va_list を初期化したオブジェクト src のコピー dst を作成する

 可変個数引数を使用する時には、va_start で可変個数引数への参照のためのオブジェクトを初期化し、va_arg で型を指定して可変個数引数を取りだし、va_end を使用してオブジェクトを破棄していました。しかし、途中まで可変個数引数を取り出したけど、実は今までの型が間違っていて、途中から取り出しを再開したいという要求がありました。そのような場合は、始めから va_start を使ってやり直す必要がありました。しかし、この va_copy を用いることで、任意の位置の取り出し位置を覚えておけるので、その位置から再び取り出すことができるようになります。

8.5 stdio.h
 stdio.h にはいくつかの関数が新たに追加されました。ただその話題に行く前に、まず printf で書式文字列に %lf が使用可能になったことについて説明しましょう。浮動小数点数を printf ファミリで出力する時には、f,e,g,E,G のどれかを使うと、float 型か double 型の値を出力することができました。ただし、float 型は printf の引数に渡される時点で double 型に拡張されてしまうので、実質は double 型の値を出力する時に指定する変換文字となります。そして、もう一つの浮動小数点数の型 long double 型を指定する時には、Lf,Le,Lg,LE,LG のように大文字の L を前に付けて表現していました。
 しかし規格をよく知らない人は、例えば、変換文字に f を使用することを考えると、float 型は f を、double 型はもっと大きいから lf を、long double 型は Lf を使っていることがよくありました。lf という書式文字列は規格では定義されていないので使うべきではないのですが、比較的多くの実装でこの表記が容認されてきました。
 今度の C 言語は、このような状況をふまえ、lf の書式文字列を容認することになりました。これで、今まで規格外の書き方をしてきた人は救われましたね (^^)
 次に、stdio.h で追加された新たな関数について説明します。まず、stdio.h ヘッダに新たな関数 snprintf が追加されました。

snprintf
名前int snprintf(char * restrict s, size_t n, const char * restrict format, ...);
ヘッダstdio.h
引数s:出力先バッファ
n:出力先バッファの文字数
format:書式
...:書式で指定した値
戻値n を無限大とした場合に出力されるはずの、終端のヌル文字分を除いた文字数。エラー時は負の値。
解説sprintf の出力文字数指定版。format に従い文字を書式化して s に最大 n - 1 文字出力する。n - 1 文字以上出力された場合は破棄される。s の終端にはヌル文字が付加される。
参考:wchar_t を受け付ける関数 swprintf があり、これはバッファ文字数を指定できる仕様になっている[update:12/27]。

 今までの sprintf では出力文字数を指定する方法が無かったので、はみ出さないかどうかどきどきして使う、または直前でオーバーフローしないように気を配ったりする必要がありました。しかし、今回の snprintf を使えばそのような心配もなくなり、安心して書式化文字列を使用できます。


vsnprintf
名前int vsnprintf(char * restrict s, size_t n, const char * restrict format, va_list arg);
ヘッダstdio.h
引数s:出力先バッファ
n:出力先バッファの文字数
format:書式
arg:va_start で初期化した値
戻値n を無限大とした場合に出力されるはずの、終端のヌル文字分を除いた文字数。エラー時は負の値。
解説vsprintf の 出力文字数対応版。format に従い文字を書式化して s に最大 n - 1 文字出力する。n - 1 文字以上出力された場合は破棄される。s の終端にはヌル文字が付加される。
参考:wchar_t を受け付ける関数 vswprintf があり、これはバッファ文字数を指定できる仕様になっている。

 stdio.h ヘッダに新たに vscanf ファミリー が追加されました。これは、今まで printf の方にはあって、どうして scanf の方には無かったんだろうと、多くの人が思っていたであろう、vscanf, vsscanf, vfscanf といった、va_list を引数に持つ scanf 関係の関数のことです。処理系によっては、始めからこれらの関数を独自のライブラリとして提供していたところも多かったかもしれません。

vscanf
名前int vscanf(const char * restrict format, va_list arg);
ヘッダstdio.h
引数format:書式
arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値
戻値変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。
解説scanf の可変個数引数部分を va_list に変更した版。標準入力からの入力を format に従い解析して arg に格納する。


vsscanf
名前int vsscanf(const char * restrict s, const char * restrict format, va_list arg);
ヘッダstdio.h
引数s:入力バッファ
format:書式
arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値
戻値変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。
解説sscanf の可変個数引数部分を va_list に変更した版。文字列 s からの入力を format に従い解析して arg に格納する。


vfscanf
名前int vfscanf(FILE * restrict fp, const char * restrict format, va_list arg);
ヘッダstdio.h
引数fp:入力ファイルポインタ
format:書式
arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値
戻値変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。
解説fscanf の可変個数引数部分を va_list に変更した版。ストリーム fp からの入力を format に従い解析して arg に格納する。


8.6 stdlib.h
 stdlib.h ヘッダに新たな関数 _Exit が追加されました。

_Exit
名前void _Exit(int status);
ヘッダstdlib.h
引数status:終了コード
戻値なし
解説signal や終了関数(atexit で登録された関数)を呼び出さずに、プログラムを終了コード status ですぐに終了させます。

 ただ、_Exit 関数の情報は Draft の仕様書には記述が無いため、たぶんに推測が含まれています。
 stdlib.h ヘッダに strtof、strtold 関数が追加されました。これらは、double を対象とする strtod を、float、long double にも対応させたものです。

strtof
strtold
名前float strtof(const char *restrict p, char **restrict endp);
long double strtold(const char *restrict p, char **restrict endp);
ヘッダstdlib.h
引数p: float 型(strtof) または long double 型(strtold) に変換したい文字列を指すポインタ
endp: 解釈を中止したポインタ位置を格納するポインタ
戻値0: 何も変換されなかったとき
+HUGE_VALF(strtof), +HUGE_VALL(strtold): +方向に表現できる範囲を超えた
-HUGE_VALF(strtof), +HUGE_VALL(strtold): -方向に表現できる範囲を超えた
それ以外: 変換した値
解説  p で指し示された文字列へのポインタを浮動小数点として解釈し、それを float 型(strtof) または long double 型(strtold) の値として変換した値を返します。解釈が終了したポインタ位置が endp に格納されます(ただし endp が NULL でない場合)。変換された値が戻り値で表現される型を超えた場合、オーバーフローした方向により、strtof の場合は +HUGE_VALF または -HUGE_VALF が、strtold の場合には +HUGE_VALL または -HUGE_VALL が返され、errno に ERANGE がセットされます。何も変換されなかった場合には 0 が返されます。
 解釈される文字列は、strtod で許されている文字列表現に加え、新しく導入された浮動小数点の16進数表記法も認識し、従来からある、INF、NAN に加え、INFINITY、NAN(DA003) のように NAN の後に( )を加えその中に数字やアルファベット、_ をつなげたものを付加情報として追加したものも認識します(これは NAN として認識します)。またこれらの前に符号をつけることができ、大文字と小文字の区別はなされません。

 また、strtol、strtoul 関数の機能を long long int 型で処理できるよう新しい関数 strtoll、strtoull 関数が追加されました。

strtoll
strtoull
名前long long int strtoll(const char *restrict p, char **restrict endp, int base);
unsigned long long int strtoull(const char *restrict p, char **restrict endp, int base);
ヘッダstdlib.h
引数p: long long 型(strtoll) または unsigned long long 型(strtoull) に変換したい文字列を指すポインタ
endp: 解釈を中止したポインタ位置を格納するポインタ
base: 変換時の基数
戻値0: 何も変換されなかったとき
strtoll の場合
 LLONG_MAX: +方向に表現できる範囲を超えた
 LLONG_MIN: -方向に表現できる範囲を超えた
strtoull の場合
 ULLONG_MAX: 表現できる範囲を超えた
それ以外: 変換した値
解説  p で指し示された文字列へのポインタを base を基数とした整数として解釈し、それを long long 型の値または unsigned long long 型の値として変換した値を返します。解釈が終了したポインタ位置が endp に格納されます(ただし endp が NULL でない場合)。変換された値が戻り値で表現される型を超えた場合、strtoll は LLONG_MAX または LLONG_MIN が、strtoull では ULLONG_MAX が返され、errno に ERANGE がセットされます。何も変換されなかった場合には 0 が返されます。base を 0 にすると文字列から自動的に基数を決定します。

 atoi、abs、div 関数の機能を long long int 型で処理できるよう新しい関数 atoll、llabs、lldiv 関数が追加されました。

atoll
名前long long int atoll(const char *p);
ヘッダstdlib.h
引数p: long long int 型に変換したい文字列を指すポインタ
戻値変換した値
解説 p で指し示された文字列へのポインタを 10 進数の整数として解釈し、それを long long int 型の値として変換した値を返します。エラー時の対応を除くと strtoll(p, NULL, 10) の動作と同じです。


llabs
名前long long int llabs(long long int val);
ヘッダstdlib.h
引数val: 絶対値を取りたい値
戻値val の絶対値
解説 val で示される値の絶対値を返します。絶対値が表現できない場合の動作は未定義です。


lldiv
名前lldiv_t lldiv(long long int num, long long int denom);
ヘッダstdlib.h
引数num: 非除数
denom: 除数
戻値除算結果
解説 num / denom の除算の結果を lldiv_t 型の値として、商をメンバ名 quot、余りをメンバ名 rem に返します。


8.7 wchar.h
 wchar.h ヘッダに新たに vscanf ファミリー が追加されました。これは、今まで printf の方にはあって、どうして scanf の方には無かったんだろうと、多くの人が思っていたであろう、vwscanf, vswscanf, vfwscanf といった、va_list を引数に持つ scanf 関係の関数のことです。処理系によっては、始めからこれらの関数を独自のライブラリとして提供していたところも多かったかもしれません。

vwscanf
名前int vwscanf(const wchar_t * restrict format, va_list arg);
ヘッダwchar.h
引数format:書式
arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値
戻値変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。
解説wscanf の可変個数引数部分を va_list に変更した版。標準入力からの入力を format に従い解析して arg に格納する。


vswscanf
名前int vswscanf(const wchar_t * restrict s, const wchar_t * restrict format, va_list arg);
ヘッダwchar.h
引数s:入力バッファ
format:書式
arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値
戻値変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。
解説swscanf の可変個数引数部分を va_list に変更した版。文字列 s からの入力を format に従い解析して arg に格納する。


vfwscanf
名前int vfwscanf(FILE * restrict fp, const wchar_t * restrict format, va_list arg);
ヘッダwchar.h
引数fp:入力ファイルポインタ
format:書式
arg:書式で指定した型の値を格納するためのオブジェクトを指す va_list の値
戻値変換した値の個数。0 かもしれない。入力エラーの場合 EOF を返す。
解説fwscanf の可変個数引数部分を va_list に変更した版。ストリーム fp からの入力を format に従い解析して arg に格納する。

 stdlib.h ヘッダに wcstof、wcstold 関数が追加されました。これらは、double を対象とする wcstod を、float、long double にも対応させたものです。

wcstof
wcstold
名前float wcstof(const wchar_t *restrict p, wchar_t **restrict endp);
long double wcstold(const wchar_t *restrict p, wchar_t **restrict endp);
ヘッダwchar.h
引数p: float 型(wcstof) または long double 型(wcstold) に変換したい文字列を指すポインタ
endp: 解釈を中止したポインタ位置を格納するポインタ
戻値0: 何も変換されなかったとき
+HUGE_VALF(wcstof), +HUGE_VALL(wcstold): +方向に表現できる範囲を超えた
-HUGE_VALF(wcstof), +HUGE_VALL(wcstold): -方向に表現できる範囲を超えた
それ以外: 変換した値
解説  p で指し示された文字列へのポインタを浮動小数点として解釈し、それを float 型(wcstof) または long double 型(wcstold) の値として変換した値を返します。解釈が終了したポインタ位置が endp に格納されます(ただし endp が NULL でない場合)。変換された値が戻り値で表現される型を超えた場合、オーバーフローした方向により、wcstof の場合は +HUGE_VALF または -HUGE_VALF が、wcstold の場合には +HUGE_VALL または -HUGE_VALL が返され、errno に ERANGE がセットされます。何も変換されなかった場合には 0 が返されます。
 解釈される文字列は、wstrtod で許されている文字列表現に加え、新しく導入された浮動小数点の16進数表記法も認識し、従来からある、INF、NAN に加え、INFINITY、NAN(DA003) のように NAN の後に( )を加えその中に数字やアルファベット、_ をつなげたものを付加情報として追加したものも認識します(これは NAN として認識します)。またこれらの前に符号をつけることができ、大文字と小文字の区別はなされません。
#2000/03/04:NAN(...)の部分を修正

 また、wcstol、wcstoul 関数の機能を long long int 型で処理できるよう新しい関数 wcstoll、wcstoull 関数が追加されました。

wcstoll
wcstoull
名前long long int wcstoll(const wchar_t *restrict p, wchar_t **restrict endp, int base);
unsigned long long int wcstoull(const wchar_t *restrict p, wchar_t **restrict endp, int base);
ヘッダwchar.h
引数p: long long 型(wcstoll) または unsigned long long 型(wcstoull) に変換したい文字列を指すポインタ
endp: 解釈を中止したポインタ位置を格納するポインタ
base: 変換時の基数
戻値0: 何も変換されなかったとき
wcstoll の場合
 LLONG_MAX: +方向に表現できる範囲を超えた
 LLONG_MIN: -方向に表現できる範囲を超えた
wcstoull の場合
 ULLONG_MAX: 表現できる範囲を超えた
それ以外: 変換した値
解説  p で指し示された文字列へのポインタを base を基数とした整数として解釈し、それを long long 型の値または unsigned long long 型の値として変換した値を返します。解釈が終了したポインタ位置が endp に格納されます(ただし endp が NULL でない場合)。変換された値が戻り値で表現される型を超えた場合、wcstoll は LLONG_MAX または LLONG_MIN が、wcstoull では ULLONG_MAX が返され、errno に ERANGE がセットされます。何も変換されなかった場合には 0 が返されます。base を 0 にすると文字列から自動的に基数を決定します。


8.8 wctype.h
 wctype.h ヘッダに新たな関数 iswblank が追加されました。

iswblank
名前int iswblank(wint_t c);
ヘッダwctype.h
引数c: 検査したい文字コード
戻値0以外:行の中に置ける空白文字、0:それ以外の文字
解説iswspace 関数を使用すると、空白文字の判定をすることができます。しかしながら、iswspace は行を分割する文字コードも空白と認識してしまいます。テキスト処理をするアプリケーションにとってはこれが問題になることがあります。iswblank はその文字が、行の中に置ける空白の場合、0 以外の値を返します。

 ただ、iswblank 関数の情報は Draft の仕様書には記述が無いため、たぶんに推測が含まれています。

←前頁へ◎表紙へ次頁へ→
 
 
表紙 - 著作権 - 注意事項 - リンクについて - 404 エラーについて
(c)1999-2014 seclan. All rights reserved.