设为首页 加入收藏

TOP

情景分析“C语言的const关键字” (二)
2014-11-24 00:43:31 来源: 作者: 【 】 浏览:71
Tags:情景 分析 语言 const 关键字
de
int main()
{
int num=12;
int tmp=100;
int *const A=#
A=&tmp;
printf("result=%d\n",*A);
return 0;
}编译时报错了:

[rocrocket@wupengchong const_test]$ !cc
cc test1.c
test1.c: In function ‘main’:
test1.c:7: error: assignment of read-only variable ‘A’
[rocrocket@wupengchong const_test]$ cat test1.c

可见A本身的值已经不能再变了。

继续修改源代码如下:

[rocrocket@wupengchong const_test]$ cat test1.c

#include
int main()
{
int num=12;
int *const A=#
(*A)=100;
printf("result=%d\n",*A);
return 0;
}编译执行结果为:

[rocrocket@wupengchong const_test]$ !cc
cc test1.c
[rocrocket@wupengchong const_test]$ ./a.out
result=100

可以看出,(*A)是可以改变的。

结论又可以轻易推出了:int *const A;   //const修饰指针A, A不可变,A指向的对象可变

==============================================================================================

情景六:const int *const A; //指针A和A指向的对象都不可变

[rocrocket@wupengchong const_test]$ cat test1.c

#include
int main()
{
int num=12;
int const *const A=#
(*A)=100;
printf("result=%d\n",*A);
return 0;
}编译会报错:

[rocrocket@wupengchong const_test]$ !cc
cc test1.c
test1.c: In function ‘main’:
test1.c:6: error: assignment of read-only location ‘*A’

改下源代码:

[rocrocket@wupengchong const_test]$ cat test1.c

#include
int main()
{
int num=12;
int tmp=100;
int const *const A=#
A=&tmp;
printf("result=%d\n",*A);
return 0;
}编译仍然会报错:

[rocrocket@wupengchong const_test]$ !cc
cc test1.c
test1.c: In function ‘main’:
test1.c:7: error: assignment of read-only variable ‘A’

呵呵,结论很明显了,const int *const A; //指针A和A指向的对象都不可变

当然const int *const A;和int const *const A=#是等价的!

情景七:如果const用在函数形参里呢?是不是又要复杂很多?

答案是NO!一点也不复杂。

来看看这个函数投:int addnum(const int num, int a, int b);

这个函数声明中的第一个形参是const int num,这就表明如果我调用了这个函数,那么第一个实参被传到addnum函数里之后,就不能再做修改了!呵呵 就这么简单。

给个例子吧,让大家能更一目了然:

[rocrocket@wupengchong const_test]$ cat test2.c

#include
int addto(const int num, int a, int b)
{
if(num==1){
return a+b;
}else{
return 0;
}
}

int main(){
int num=100;
int a=12,b=22;
int res;
num=1;
res=addto(num,a,b);
printf("res=%d\n",res);
return 0;
}编译执行结果为:

[rocrocket@wupengchong const_test]$ !cc
cc test2.c
[rocrocket@wupengchong const_test]$ ./a.out
res=34

如果我修改一下,编译就会出错:

[rocrocket@wupengchong const_test]$ cat test2.c

#include
int addto(const int num, int a, int b)
{
if(num==1){
num=3;
return a+b;
}else{
return 0;
}
}

int main(){
int num=100;
int a=12,b=22;
int res;
num=1;
res=addto(num,a,b);
printf("res=%d\n",res);
return 0;
}编译报错为:

[rocrocket@wupengchong const_test]$ !cc
cc test2.c
test2.c: In function ‘addto’:
test2.c:5: error: assignment of read-only location ‘num’

可见在函数里形参被声明为const的变量也是不能修改的哦!呵呵~

const其实不难,把本文的几个小例子看懂就OK了!

除了传递要求为const的参数以外,自己声明对象没有什么必须要加,但是对于一个逻辑上不应该被修改,应该为常量的对象,没有声明为const,就必须由程序员自己来维护,来记住这个变量不应该被修改,即使你不小心修改导致程序整体混乱了,编译器也不会报错
另,const和普通变量的声明存在于头文件时有区别,总之这些都是与你具体写程序的规划有关系,const这个玩意只是方便程序设计和程序编写,能够使程序更加的清晰,如果说我就是不爱用,就是喜欢一路变量用到底,那也没什么不行


摘自 C'est la vie
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇字节对齐 下一篇C语言个人进阶

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: