设万维读者为首页 万维读者网 -- 全球华人的精神家园 广告服务 联系我们 关于万维
 
首  页 新  闻 视  频 博  客 论  坛 分类广告 购  物
搜索>> 发表日志 控制面板 个人相册 给我留言
帮助 退出
     
  YDX的博客
  YDX的博客
网络日志正文
两堂C/C++基础课()和 [] 2011-04-09 23:28:55
基础课一:函数调用算符()

我在前文中提到下面这行难住10岁开始编程的牛博士的代码

local = (char *(*)()) inc_1;

很多人号称学过C,但是看了这行代码看不懂之后,说这是垃圾。其实这是一句必要的code,程序员在写的时候并没有在故弄玄虚,而是写了最简短的代码。这是一个很早以前的程序中的一行代码,并非编造。而且是一行简单的代码--如果你能懂C。

按理说,一个人学过C/C++, 要有点创造力,可以几乎零成本创业,一台PC,加上大脑就应该可以开发产品了---Linus一个人完成了Linux主要核心部分,Thompson和Ritchie一万多行C搞定UNIX 。

问题在于,很多人学了C,并不懂C语言,他们只会文科C:就是模仿一些pattern,依样画葫芦,真要变通一下,就搞不清了。要成为高等电民,得学会理工思维,搞清原理,否则跟劳工差不多,只会copy&paste。

看上面这段代码右边,最外面是一层括弧后跟一个inc_1,所以这是一个cast 语句,也就是括号里面必须是一个type。什么type呢?一看里面的()的算符就知道了,()叫函数调用算符(当然这里的作用不是调用函数,而是声明类型), call operator。所以里面是一个pointer to function,而这个function的return type是 char*。

当然,程序员如果稍微勤快点,他可能会这么写

typedef char* (*ptr_func)();

local = (ptr_func) inc_1;


基础课二:下标算符 [ ]

C++基本是C的一个superset,因此C里的表达在C++绝大部分是合法的。

E1 [E2] 类型的expression 为postfix-expression的一种。

其中E1为postfix-expression, E2为expression. 

E1[E2]的语义是 *(E1+E2).

所以我们只要求 E1+E2 产生一个指针。根据+运算的属性,只要E1或者E2中的任一个是指针即可。换言之,E1[E2]与E2[E1]可能是完全等价的(排除[]被重载的情况)。

浏览(634) (0) 评论(1)
发表评论
文章评论
作者:姚夭夭 留言时间:2011-04-10 12:01:22
按岳东晓自己的标准,他也是被10[a]问倒了。回去查书也查了一天(24小时),那个磚家记不得
(char*(*const)(int))PRT,
要回家查书也没什么奇怪的。书上都没讲这些。我还是在十好几年前第一份工作时试验了几天才学会的(那时我想用C语言搞个中断向量表)。书上不讲的,那时网上的资料没有现在的这么多。
回复 | 0
我的名片
-YDX-
注册日期: 2010-08-29
访问总量: 748,700 次
点击查看我的个人资料
Calendar
最新发布
· 给肯特州立大屠杀受难者平反不符
· 除暴安良的正义感超越国家与制度
· 以人民民主制衡封建官僚主义是反
· 为什么中国能拿乒乓球冠军却拿不
· 从杨开慧的死看历史为什么选择了
· 大众社会的操控模式与互联网时代
· 肯特州立事件的平反问题
分类目录
【日志】
· 给肯特州立大屠杀受难者平反不符
· 除暴安良的正义感超越国家与制度
· 以人民民主制衡封建官僚主义是反
· 为什么中国能拿乒乓球冠军却拿不
· 从杨开慧的死看历史为什么选择了
· 大众社会的操控模式与互联网时代
· 肯特州立事件的平反问题
· 什么是哥特建筑--历史知识
· 尝试翻译温家宝总理的几句话
· 华裔女生偷窥、白人男生自杀事件
存档目录
2012-06-03 - 2012-06-03
2012-05-11 - 2012-05-11
2012-04-03 - 2012-04-15
2012-03-02 - 2012-03-29
2012-02-01 - 2012-02-28
2012-01-13 - 2012-01-31
2011-12-04 - 2011-12-28
2011-11-03 - 2011-11-24
2011-10-03 - 2011-10-29
2011-09-01 - 2011-09-25
2011-08-16 - 2011-08-31
2011-07-01 - 2011-07-27
2011-06-04 - 2011-06-29
2011-05-04 - 2011-05-31
2011-04-02 - 2011-04-28
2011-03-05 - 2011-03-28
2011-02-01 - 2011-02-28
2011-01-03 - 2011-01-27
2010-12-01 - 2010-12-31
2010-11-03 - 2010-11-30
2010-10-03 - 2010-10-30
2010-09-29 - 2010-09-30
2010-08-28 - 2010-08-29
 
关于本站 | 广告服务 | 联系我们 | 招聘信息 | 网站导航 | 隐私保护
Copyright (C) 1998-2024. Creaders.NET. All Rights Reserved.