10.3.3 volatile
这个类型和const正好相反。它明确地告诉编译器,指定类型变量的值会改变。在语言中加入这个关键字是为了防止编译器优化掉看似多余的变量赋值,同时避免重复地检查值没有变化的变量。I/O端口就是一个很好的例子,这涉及到对指针的理解(参见第13章)。
假设在程序中,将输出端口的地址存储在一个名为outPort的变量中。如果要向这个端口写两个字符(一个O后面接一个N),可能会写出下面的代码:
*outPort=‘O’;
*outPort=‘N’;
第一行表示在outPort指定的内存地址存储字符O。第二行则表示在同一位置存储字符N。一个智能的编译器可能发现对同一地址进行了两次连续的赋值。因为outPort在这两者之间并没有被修改,所以编译器将第一个赋值语句从程序中删除。要防止这种情况发生,应该将outPort声明为一个volatile变量,如下所示:
volatile char*outPort;