意义:
**它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。 **
下面我们来看看错题
下列三段代码效果一样?
int b;
1)const int *a = &b;
2)int const *a = &b;
3)int *const a = &b;
乍一看,组成这三段代码的元素都是一样的,分别是
const
int
但是他们排列的顺序都各不相同,组合的不同也代表着意义的不同,效果的不同
先看1):const 在 * 的左边,这就规定了a的值不可由地址的改变而发生变化
再看2):和1)一样,const 在 * 的左边
看看3):const 在 * 的右边,表明了指针的指向不变
答案显而易见,1)和 2)效果一样
对于 const 与 * ,总结一下:const 在 * 左,定向 ; const 在 * 右,定值。
意义:
声明静态变量
听起来很玄乎是不是?为啥声明?静态变量是啥?
在程序执行前系统就为之静态分配分配(也即在运行时中不再改变分配情况)存储空间的一类变量
还不清楚?来看看题目吧。
int f(int n)
{
static int i = 1;
if(n >= 5)
return n;
n = n + i;
i++;
return f(n);
}
上述函数 f(1) 的值为?
由于 static 的出现,i 的生命发生了天翻地覆的变化:它的生命周期不再像简单的 int i 一样,它的地址从一开始就被分配,并且在函数运行结束之前都不会改变,这代表什么?在这个特定的地址上,每次 i++ 都会使 i 的值加1。不难得出,这题的答案是7.
答案不是最重要的,重要的是 static 声明静态变量的作用。
意义:
计算数据类型或变量长度(即所占字节数)
sizeof 的运用较简单,但是也不乏有意思的题目
#include
int main()
{
int i = 1;
sizeof(i++);
printf("%d\n",i);
return 0;
}
看起来很简洁,但是又一看,有点怪,sizeof(i++) ?
sizeof 是一个编译阶段就执行的运算符,在其内的任何运算都不执行。
所以这题的答案是1
不要想太多,当然也不能不知道这个知识点就瞎蒙答案。
我们再看一道题:
#include
int i;
int main()
{
i--;
if(i < sizeof(i))
{
printf(">/n");
}
else
printf(");
return 0;
}
这段代码的运行结果是?
首先,注意 int i;
,这是个未初始化的全局变量,所以它默认为0.
然后就到了重点,if(i < sizeof(i))
中,sizeof()
的返回值是 unsigned int
也就是无符号整型,在作比较的同时,编译器也会自动将左侧的 i
转化为无符号整型,由于默认为0,所以 i--
后 i
的值为-1
0 : 00000000 00000000 00000000 00000000
-1 : 11111111 11111111 11111111 11111111
可见,-1对应的无符号整型是很大很大的数字,自然,这道题的答案是 >
意义:
**在默认情况下声明的整型变量都是有符号的类型( char 有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。 **
**unsigned **能存储的数据范围则是0~65535(这个最高位不用做符号位,所以是2的16次方,一共65536)。由于在计算机中,整数是以 补码 形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数
关于 unsigned ,绕人的题目也不少:
#include
int i;
int main()
{
i--;
if(i < sizeof(i))
{
printf(">/n");
}
else
printf(");
return 0;
}
没错,和上边 sizeof()
的题一样,再强调一次加深印象。