每日收获之enum/typedef

在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,表示指针本身是一个常量。因此进行加法运算会报错。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值