#include<stdio.h>
int main()
{
int num1 = 0;
const num2 = 0;
num1 = 10;
num2 = 10;
return 0;
}//num1和num2是否可以被修改?
在上边的例子中,num1是一个整型变量,修改它的值是没有问题的,但是num2是const修饰的变量,它具有常属性,不能被修改。const修饰的变量不能被修改,那它是不是常量呢?请看下面的例子。
#include<stdio.h>
int main()
{
const int sz = 10;
int arr1[10];
int arr2[sz];
return 0;
}//请将这段代码在环境里编译一下,看它是否能通过。
事实上,这段代码是错误的。const修饰的变量只是一个具有常属性的变量,而不是常量,所以 int arr2[sz];是编译不了的。
//test.cpp
#include<stdio.h>
int main()
{
const int sz=20;
int arr1[20];
int arr2[sz];
return 0;
}//这段代码可以编译成功吗?
这段代码是正确的,因为在C++中,const修饰的变量就是常量。
★这个关键字的作用是类型重命名,举一个很形象的例子:假如你叫张三,然后你的家人为了简便,把你叫作小三。请看下面的例子:
#include<stdio.h>
typedef unsigned int UINT
int main()
{
unsigned int num1=0;
UINT num2=0;
return 0;
}
在上边的代码中,num1和num2的类型是一样的,UINT是unsigned int 的别名。当然,在C语言中,还可以用#define重命名。例如:#define UINT unsigned int .
③register关键字
#include<stdio.h>
int main()
{
register int a=0;
//建议编译器把变量a存为寄存器变量
return 0;
}
★如果一个变量很重要,出现次数很多,编译器会建议把这个变量存为寄存器变量。
#include<stdio.h>
int main()
{
const int num = 10;//const修饰的常变量
int *p=(int*)&num;
*p=20;
//通过指针修改const修饰常变量的值
return 0;
}
上边的代码在C语言中,变量的值可以被改成20,但是在C++中,num的值还是20。因为在C++中,编译器会对代码进行优化,将const修饰的变量放在寄存器中,运行代码的时候回直接从寄存器中拿,num虽然被修改了,但它的值仍然是10。volatile关键字的作用是防止编译器对代码进行优化,直接从内存里拿,保证内存的可见性。请看下面的代码:
//test.cpp
#include<stdio.h>
int main()
{
volatile const int num = 10;//防止编译器对代码进行优化
int *p=(int*)&num;
*p=20;
//通过指针修改const修饰常变量的值
return 0;
}
#include<stdio.h>
void test()
{
int num=0;
num++;
printf("%d\n",num);
}
int main()
{
int i=0;
for(i=0;i<10;i++)
{
test();
}
return 0;
}
上面代码的输出结果为1 1 1 1 1 1 1 1 1 1,但是如果test函数中的num被static修饰,运行结果将会是什么呢?
#include<stdio.h>
void test()
{
static int num=0;
num++;
printf("%d\n",num);
}
int main()
{
int i=0;
for(i=0;i<10;i++)
{
test();
}
return 0;
}
这段代码的运行结果为1 2 3 4 5 6 7 8 9 10,请自行动手编译一下代码。