表紙 / 自作ソフト / 日記 / 宝箱 / サイト情報 / 検索
一般 / 新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 の書式

5. 整数型
 今まで C 言語の整数型は char、short int、int、long int 型がありましたが、今回からこれに加え _Bool 型と long long int 型が使用可能になります。本章ではこれら新たに加わった二つの整数型と変更された整数の除算ルールについて説明します。

5.1 _Bool 型
 多くの人が使っていたけど、言語仕様の中では規定されていなかった...。今度の新しい C 言語では、それが仕様に取り込まれました。それとは bool 型です。多くの人が bool や _bool, BOOL, Bool などと typedef あるいは define をして使用していますが、とうぜん各人によってその名前はバラバラでした。したがって他人の作ったライブラリを利用するとき定義が衝突したりしり、ソースプログラム上で表記の統一がとれなくなったりして、問題が発生しました。
 今度の C 言語では新しい整数型 _Bool 型を導入することでその問題を解決します。この型は 0 と 1 が入れば十分な大きさとされており、必ずしも int 型と同じサイズであるとは限りません。簡単に性質を説明すると次のようになります。
  • _Bool型は符号なし型として扱われる
  • _Bool型には signed, unsigned はつけられない
  • _Bool型は 0 と 1 を格納できれば十分なサイズ
  • _Boolに変換するときその値が0なら0、それ以外は 1
  • _Bool型はどの標準整数型ランクよりも小さい
  • ビットフィールドに無修飾版の _Bool をおける
 _Bool という名前は既存の名前と衝突しないようにという配慮からなされたものと思います。

5.2 long long int 型
 C 言語が初めて作成されてから、現在までかなりの時間が経過しています。それに従い計算機も進化してきました。例えば、64 bit のアドレス空間を持つ CPU の登場です。64bit あれば 18E(エクサ)もの巨大な数を表すことができます。従来の C 言語のコンパイラではそのような巨大な数を表現することは想定していませんでした。そこで、今回新たに long long int という、long 型よりもさらに大きな数を表現できる型が新設されました。具体的な大きさなどは次の通りです。

整数型一覧
符号基本型limits.h保証値
signedcharSCHAR_MIN-127
SCHAR_MAX+127
unsignedUCHAR_MAX255
signedshort intSHRT_MIN-32,767
SHRT_MAX+32,767
unsignedUSHRT_MAX65,535
signedintINT_MIN-32,767
INT_MAX+32,767
unsignedUINT_MAX65,535
signedlong intLONG_MIN-2,147,483,647
LONG_MAX+2,147,483,647
unsignedULONG_MAX4,294,967,295
signedlong long intLLONG_MIN-9,223,372,036,854,775,807
LLONG_MAX+9,223,372,036,854,775,807
unsignedULLONG_MAX18,446,744,073,709,551,615

limits.h は limits.h で定義されている名称を示しています。保証値はどの環境へ行っても最低限保証される値を示しています。実は、この long long int 型については、日本側から、ROMプログラムを作成するときなどはこんな巨大な数は必要ないのになんでオプションでないのか理由をきちんと書いて欲しいという提案も出たりしました。
 さてこの long long int 型は gcc や一部の UNIX ではすでに実装されているところもあるので、今回新たに追加された仕様とは知らず、「long long int 型は(従来の) C 言語の仕様で決められているんでしょ」とか言う人もいるかもしれません。

5.3 long long int 型の定数
 今回の C 言語では、long long int 型が新設されています。もちろん整数型なのでそれに応じた定数も記述できるようにする必要があります。従来の C 言語では整数の後ろに型を表す記号をつけて、それをあらわしていました。long long int 型はそれを自然に拡張した表記法を用います。

整数定数の表記法
型名サフィックス
符号あり符号なし
intなしu,U234u, '0', 'a', 133
long intL,lUL,LU,ul,luなど1243L,334ul
long long intLL,llULL,LLU,ull,lluなど1234LL, 134ull

 long long int 型は LL または、ll というサフィックスを用いて表現します。Ll とか lL という表記は不可です。u をつけると符号なしという意味になります。u と l, ll の間では大文字小文字は統一されている必要はありません。また、初心者は '0' や 'a' という表記は char 型だと思っていたりするので注意する必要があります。それは間違いなく int 型の定数です。ただし、C++ 言語においてはその限りではありません。
 ちなみに long long int 型を printf や scanf で用いる場合に使用する型指定の記号は 'll' を用います。例えば、"value=%lld" という風に書きます。

5.4 整数除算
 整数の除算に何か問題があるの?そう思う人も多いでしょう。しかし現在の C 言語では、整数の除算に関しては移植性がありません。どういう場合に移植性がないのかといえば、整数を割るときのどちらかのオペランドが負であった場合です。
 現在の C 言語の規格では両方のオペランドが正の数の場合、商は小数点以下を捨てた数になることになっています。例えば、1/2の場合、正しい値は、0.5 ですが、小数点以下を捨てるので商は 0、余りは 1になります。余りは、(a/b)*b + a%b == a を満たす値となります。
 しかし、どちらか一方の数が負の場合、その結果は実装依存になっています。例えば、-1/2 の正しい結果は、-0.5 ですが、環境によって商0余り-1になったり、商-1余り1になったりします。
 今回の新しい C 言語では、割り算の結果はすべて 0 方向に切り捨てることになりました。例えば、-1/2 では結果が、-0.5 ですが、0 方向に切り捨てるので、商は 0 になります。すると余りは、-1 ということになります。これがすべての環境で保証されることになりました。

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