情景分析“c语言的const关键字”

上传人:kms****20 文档编号:39825301 上传时间:2018-05-20 格式:DOC 页数:12 大小:37.50KB
返回 下载 相关 举报
情景分析“c语言的const关键字”_第1页
第1页 / 共12页
情景分析“c语言的const关键字”_第2页
第2页 / 共12页
情景分析“c语言的const关键字”_第3页
第3页 / 共12页
情景分析“c语言的const关键字”_第4页
第4页 / 共12页
情景分析“c语言的const关键字”_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《情景分析“c语言的const关键字”》由会员分享,可在线阅读,更多相关《情景分析“c语言的const关键字”(12页珍藏版)》请在金锄头文库上搜索。

1、情景分析情景分析“C“C 语言的语言的 constconst 关键字关键字”C 语言中的 const 一直是 C 语言初学者心中的痛,这是因为 const在不同位置有不同作用,在不同情景有不同角色。这让初学者摸不清头脑。今天,和大家一起研究一下 const,让它的每个角色都“深入人心”!=情景一:最简单的 const 用法#includeint main()int const a;a=5;printf(“a=%dn“,a);return 0;如果编译这个 c 文件,就会报错:1071.c: In function main:1071.c:5: error: assignment of read

2、-only variable a显而易见,这是 const 在搞鬼,因为声明了 const 的变量是不能修改的!如果将源代码修改为如下这样,就没有问题了!#includeint main()int const a=5;printf(“a=%dn“,a);return 0;总结:const 声明的变量必须要进行初始化赋值,如果错过这个机会,以后再想给 const 的变量赋值,可就没门了!切记PS:int const 和 const int 是一回事, “颠倒写”都是可以的。以后遇到了别犯晕,呵呵。但是,还是要留个心眼,当 const 和指针搀和到一起时,这个“颠倒写”的规律可未必成立。=情景二:

3、发明 const 为了什么?在 const 诞生之前,开发者一直使用#define VAR 100 来定义一些有特殊用途的类常量,不过这样定义是存在一些劣势的。因此const 应运而生,之后开发者可以使用 const int VAR=100;来定义类常量了。至于为什么#define 有其劣势,还要读者自己去 google 下。:)=情景三:const 和指针的配合是噩梦!你能分辨得清这些声明么:const int *A;int const *A;int *const A;const int *const A;如果有点犯晕的话,那就先给出它们的讲解,然后继续看后面的情景分析吧。const int

4、 *A; /修饰指向的对象,A 可变,A 指向的对象不可变int const *A; /修饰指向的对象,A 可变,A 指向的对象不可变int *const A; /修饰指针 A, A 不可变,A 指向的对象可变const int *const A; /指针 A 和 A 指向的对象都不可变=情景四:const int *Arocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;const int *A=printf(“result=%dn“,*A);return 0;编译执行结果为:rocrocketwup

5、engchong const_test$ cc test1.crocrocketwupengchong const_test$ ./a.outresult=12接下来,我们动动手脚,在代码中加入了(*A)+;这条语句:rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;const int *A=(*A)+;printf(“result=%dn“,*A);return 0;编译这个 c 文件:rocrocketwupengchong const_test$ !cccc test1.ctest1.c: I

6、n function main:test1.c:6: error: increment of read-only location *A可以看到,报错了,报错的内容表示”*A”是只读的,不能修改。我们再修改一下源代码为下面这样:rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int tmp=100;const int *A=A=printf(“result=%dn“,*A);return 0;编译执行结果为:rocrocketwupengchong const_test$ !cccc test1.

7、crocrocketwupengchong const_test$ ./a.outresult=100好了,如果你仔细看了这几个小得不能再小的程序,你自己都可以给出结论了!结论:如果声明了 const int *A,那么 A 值是可以修改的,而*A 是不可以修改的。更通俗的说,A 指针可以随便指向一个整型,但只要被 A 盯上了的整型变量在使用*A 引用时就不能修改了。rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int tmp=100;const int *A=A=tmp=3;printf(“r

8、esult=%dn“,*A);return 0;编译执行的结果为:rocrocketwupengchong const_test$ !cccc test1.crocrocketwupengchong const_test$ ./a.outresult=3结论 2:即使 A 指向了 tmp,我虽然不能修改*A,但是我仍然是可以用 tmp 来修改这个值的,完全不管*A 的存在。呵呵=情景五:int *const Arocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int *const A=printf(

9、“result=%dn“,*A);return 0;编译执行结果为:rocrocketwupengchong const_test$ !cccc test1.crocrocketwupengchong const_test$ ./a.outresult=12我们稍微修改下源代码:rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int tmp=100;int *const A=A=printf(“result=%dn“,*A);return 0;编译时报错了:rocrocketwupengchong

10、 const_test$ !cccc test1.ctest1.c: In function main:test1.c:7: error: assignment of read-only variable Arocrocketwupengchong const_test$ cat test1.c可见 A 本身的值已经不能再变了。继续修改源代码如下:rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int *const A=(*A)=100;printf(“result=%dn“,*A);return

11、 0;编译执行结果为:rocrocketwupengchong const_test$ !cccc test1.crocrocketwupengchong const_test$ ./a.outresult=100可以看出,(*A)是可以改变的。结论又可以轻易推出了:int *const A; /const 修饰指针 A, A 不可变,A 指向的对象可变=情景六:const int *const A; /指针 A 和 A 指向的对象都不可变rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int c

12、onst *const A=(*A)=100;printf(“result=%dn“,*A);return 0;编译会报错:rocrocketwupengchong const_test$ !cccc test1.ctest1.c: In function main:test1.c:6: error: assignment of read-only location *A改下源代码:rocrocketwupengchong const_test$ cat test1.c#includeint main()int num=12;int tmp=100;int const *const A=A=p

13、rintf(“result=%dn“,*A);return 0;编译仍然会报错:rocrocketwupengchong const_test$ !cccc test1.ctest1.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!

14、一点也不复杂。来看看这个函数投:int addnum(const int num, int a, int b);这个函数声明中的第一个形参是 const int num,这就表明如果我调用了这个函数,那么第一个实参被传到 addnum 函数里之后,就不能再做修改了!呵呵 就这么简单。给个例子吧,让大家能更一目了然:rocrocketwupengchong const_test$ cat test2.c#includeint addto(const int num, int a, int b)if(num=1)return a+b;elsereturn 0;int main()int num=100;int a=12,b=22;int res;num=1;res=addto(num,a,b);printf(“res=%dn“,res);return 0;编译执行结果

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号