基础课一:函数调用算符()
我在前文中提到下面这行难住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]可能是完全等价的(排除[]被重载的情况)。
|