プログラミング言語C – 型指定子
津路です。
引き続き、プログラミング言語C 第2版 ANSI規格準拠 K&R著(共立出版)を読んで、気になるところを書いています。
今回は、A8.2 型指定子です。
void, char, short, int, long, float, double, signed, unsigned, struct/union, enum, typedef
以下の文章から始まります。
「intと一緒には、たかだか一つのlongあるいはshortしか使えない。
その意味は、intが書いてなくても同じである。」
第2文が良く分かりませんでした。long int や short intは指定できるが、intが指定されていない場合でも、long か shortしか指定できない、という意味でしょう。
「longということばはdoubleと一緒に指定してもよい。」
こちらは、long double と指定できるという意味です。
「int あるいはshortもしくはlong型、あるいはcharでは、たかだか一つのsignedあるいはunsignedが指定できる。そのいずれも単独で現れてよいが、その場合はintと仮定される。」
この文章では、
signed int, signed short, signed long, signed charなどといった指定ができるということで、第2文は、signedかunsignedだけしか指定がない場合は、singed int あるいは unsigned intと仮定される、という意味です。
「このsigned指定子は、charオブジェクトに強制的に符号を持たせるのに有用である。これは他の整数型でも許されるが、それは余分である。」
「余分である」とは、意味がないかのように解釈できますが、原文ではredundant with other integral types と書いてあるので、冗長であるという意味です。
char型のsigned/unsignedは、処理系定義です。ほかの型では、指定しなくてもsignedと仮定されます。
「以上のいずれでもないときは、たかだか一つの型指定子を宣言の中で与えることが可能である。宣言に型指定子がなければ、それはintと受け取られる。」
「型には、宣言されるオブジェクトの特別な性質を示すのに、次のような修飾子を付けても良い。
type-qualifier:
const
volatile
型修飾子はどの型指定子につけても良い。constオブジェクトについては初期化は許されるが、その後での代入は不可能である。volatileオブジェクトについては、処理系独立な意味づけは行われていない。」
「const および volatile は、ANSI標準で新設されたものである。constの目的は、読み出し専用メモリの中に置いても良いオブジェクトを宣言することにあり、これは最適化の機会をふやすものと考えられる。
一方、volatile の目的は、黙っていると処理系で行われる最適化を抑止することにある。」
volatile指定しないと処理系で行われる最適化を抑止、といった意味です。volatileは揮発性と訳すそうです。要するに、最適化されると困る場合にのみ使用します。
「例えば、メモリ・マップ方式の入出力をもつマシンでは、デバイス・レジスタに対するポインタは、ポインタによる見かけ上、冗長な参照をコンパイラが除去するのを防ぐのに、volatileへのポインタと宣言することが可能である。」
何を言ってるかというと、メモリマップドI/O方式の処理系では、デバイス・レジスタへのポインタがvolatileへのポインタとして宣言されたりする。その目的は、ポインタを通じた冗長に見える参照が除去されるのを、抑止することです。