在GA教学视频中学习到设定input以及output参数后,开始模块的主体部分,函数被定义为bool类型,回想起看到的很多代码都是bool类型,就来博客世界里学习一下。
由于C功底弱,在学习的过程中被许多标识符挡住,就变成了发散式学习。所以这篇blog中的两个内容正是学习bool时遇到的问题。
enum
enum定义了一种枚举类型,其形式为:
enum 枚举名{
标识符1,
标识符2,
…
} 枚举变量;
举例说明:
#include <stdio.h>
using std::cout;
using std::endl;
int main(){
enum string {
x1=5,
x2,
x3=7,
x4,
}x;
cout<<x<<endl;
system("pause");
}
可以对x赋枚举类型内部的值,也可以赋其他值,但是x被定义为string类型,因此要进行类型转换:
x = (string) 5;//正确
x = 5;//错误
此外,之所以我会从bool的学习发散到enum的学习,是因为,其他博客文章中说,从前没有boolean内置类型时,要使用enum进行模拟:
typedef enum {
false = 0,
true = 1,
}bool;
这里可以看到将bool定义为enum变量,可以取0和1两个值,符合boolean类型的设定~
因此又引申出了typedef的用法。
typedef
具体的介绍以下链接中的 文章阐述的很清楚,这里就不作赘述了。
http://blog.sina.com.cn/s/blog_4826f7970100074k.html
在这篇文章中,提到了如何理解复杂的声明,我重点贴出来:
【理解复杂声明可用的“右左法则”:
从变量名看起,先往右,再往左,碰到一个圆括号就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直到整个声明分析完。举例:
int (*func)(int *p);
首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以 func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值类型是int。
int (*func[5])(int *);
func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先 级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。
也可以记住2个模式:
type (*)(....) 函数指针
type (*)[ ] 数组指针】
以下链接也是一篇讲 typedef 的很好的文章。
http://www.cnblogs.com/charley_yang/archive/2010/12/15/1907384.html
收获最深的是,使用 typedef 定义的一个指针变量类型,与系统固有类型的差异:
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
其中,最后一句会报错。原因在于:
const char *p1 = string;
这句代码 const 与指针复合使用,因此属于底层const(参考C++Primer书中p57),因此指针p1所指的对象是一个常量,但是指针本身可以改变。
const pStr p2 = string;
但是这句中,pStr 是自定义的类型,不能直接等同于char *,因此这句依旧是顶层const,表示指针本身是一个常量。因此进行加法运算会报错。