C语言拾遗(二):符号重载
来源:互联网 发布:js怎么让按钮显示 编辑:程序博客网 时间:2024/05/18 13:11
C语言一个很重要的特点是简洁。但有时候它太简洁了,仅增加,修改或删除一个字符,原先的程序就可以截然不同。
简洁的C语言会让一个符号,在不同的上下文环境里表示不同的意思。这称之为符号“重载”。
比如void符号,会有以下常见的不同含义:
1>作为函数的返回类型,表示不返回任何值
2>在指针声明中,表示通用指针
3>位于函数的参数列表中,表示没有参数
再来举个乘号*的例子,看看有趣的,“糟糕的”符号重载吧。
上代码:
1 #include <stdio.h> 2 3 int main() 4 { 5 int p, N = 5, *q = &N; 6 7 p = N * sizeof * q; 8 printf("p = %d.\n", p); 9 10 p = N * sizeof(int) * p;11 printf("p = %d.\n", p);12 13 p = N * sizeof((int) * q);14 printf("p = %d.\n", p);15 16 /* 错误: 双目运算符 * 操作数(‘unsigned int’和‘int *’)无效*/17 //p = N * sizeof(int) * q;18 //printf("p = %d.\n", p);19 20 return 0;21 }
先不要看变量的定义(因为变量的类型会有提示作用哦),直接看line7,10,13,17的表达式,你知道分别表示什么意思吗?
好了,看结果吧,
randy@ubuntu:~/C_Language$ ./a.out
p = 20.
p = 400.
p = 20.
解释:
line7:又遇到sizeof了,记住,sizeof是运算符,不是函数。sizeof的操作数是类型时,必须叫括号,比如sizeof(int)。N=5,q是指针,指向N的地址,
所以*q=5,是int类型,sizeof(int)=4,故p=5*4=20.
line10:p=5*4*20=400.
line13:其实是跟line7一样一样儿的。
line17:该表达式被我注掉了,因为编译不通过。应该知道原因了吧?(答案在注释)
小结:例子中,一个小小的*是不是有点绕人,当然还有很多其他符号重载的例子。
比如 static,extern, &, <, () 等。
这是C语言的简洁之美呢,还是简洁之痛呢?抛砖引玉,欢迎讨论!
---End---
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- C语言拾遗(二):符号重载
- C语言拾遗(二)
- C语言中的符号重载
- C语言中的符号重载
- C语言中的符号重载
- C语言中的符号重载
- C语言中的符号重载
- C语言中的符号重载
- C语言中的符号重载,static
- C语言拾遗
- c语言拾遗3
- c语言拾遗4
- C语言拾遗
- C语言拾遗
- C语言拾遗
- C语言数据类型拾遗
- C语言函数拾遗
- C语言数组拾遗
- 命名空间的基本概念
- 判断日期的有效性,要求年份必须大于1970?
- MUTC 2 D - Matrix 并查集
- 死锁
- LINUX-C成长之路(五):控制流
- C语言拾遗(二):符号重载
- C语言的发展史-2
- 稀疏矩阵——创建和可视化
- 提高系统性能的方法简单总结
- Mac OS X 下命令行编译错误: ld: library not found for -lcrt1.10.6.o
- SDP协议介绍
- 图片的上传
- mmc/sd/sdio的区别
- arm驱动程序——点亮led-利用次设备号(韦东山的视频总结及针对linux-2.6.30)