龙盟编程论坛 | 龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++基础入门教程(七):一些比较特别的基础语法总结

时间:2014-11-18 03:19来源:网络整理 作者:网络 点击:
分享到:
这篇文章主要介绍了C++基础入门教程(七):一些比较特别的基础语法总结,本文总结的都是一些特殊的语法,需要的朋友可以参考下

这次又到了比较简单的内容了,介绍了一些基本的循环控制、关系表达式、逻辑控制等。
这里就简单抽一些稍微比较特别的内容来吹吹水,不,是来总结一下吧~

一、i++和++i

不,我不是来解释i++和++i的区别的,只是书上提到一点,在使用for循环的时候,倒底i++和++i有没有区别呢?
答案是:几乎没有,随便你用哪一个。
 
但是,要稍微注意一下两种方式的内部处理方式:

i++:先复制一个i的副本,然后将i加1,最后返回i的副本。
++i:将i加1,然后返回i。
 
这么一说,大家都知道谁的效率更高,但对于现在的编译器而言,是会自动优化的(但不知道是不是所有编译器都这样)。
然后,C++是允许自定义操作符的行为的,也就是说,我们可以为自己的类定义++操作,这时候,复制类的副本,消耗明显就不能忽略不计了。

这个,就不多说了。

二、逗号运算符

逗号运算符可以将多条语句放到一起,如:

复制代码 代码如下:

    for (int i = 2, j = 10 * i; i < 999; i++) {
        cout << j;
        break;
    }

int i = 2, j = 10 * i;就是逗号表达式了,那么,j的值是多少呢?没错,是20。
再来, 这样:
复制代码 代码如下:

int num = 0;
num = 10, 50;

注意,声明变量赋值的时候是不能使用逗号表达式的,这个自己在编译器编译一下就知道了~规则这东西,没必要死记~
这里的num值是多少呢?没错,是10,因为赋值比逗号表达式优先级要高,所以先把10赋值给num,后面的50被舍弃了。
那么,这样呢:num = (10, 50);  结果是50,因为括号的优先级比赋值语句高,逗号表达式沾了光,所以最后是把50赋值给了num。
 
但是,如果有谁非特殊情况下用这样的赋值形式,那么,我保证不打死他。

三、类型别名(typedef)

这又是新手的一个痛点,大部分初次接触Cocos2d-x的朋友,一定被这两条语句吓死过:

复制代码 代码如下:

typedef void (Ref::*SEL_SCHEDULE)(float);
#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)

这看似神复杂的东西,倒底是什么?这其实就是我们使用schedule定时器功能时要用到的。
这里先放着。
 
我们先来看看最简单的typedef用法:

复制代码 代码如下:

typedef int IQ;
IQ mutouIQ = 250;
int normalIQ = 1;

所谓类型别名,就是给某个类型的名字取个外号,比如我们把使用IQ代替int,如上代码。
使用typedef int IQ,就代表把int取了个别名,叫做IQ,以后就可以用IQ来定义整数了。
粗俗地说,IQ就是int,int就是IQ,懂了吧~
 
再来看看这个:typedef char* mpointer;
那么,我们以后就可以使用mpointer来定义char类型的指针。
 
大家有没有发现什么?
如果把typedef去掉,就变成这样:

复制代码 代码如下:

int IQ;
char* mpointer;

没错,IQ和mpointer就像是一个变量名(在上面这段代码里它们就是变量名)。
结果就是,在声明变量之后,前面加上typedef,就然后这个变量成为了类型的别名。
很好理解吧?以后看到typedef很复杂的,就把typedef去掉,看看是声明的什么变量,那这个别名就是代表这样的变量了。
 
接下来,再回到那神复杂的两条语句:

复制代码 代码如下:

typedef void (Ref::*SEL_SCHEDULE)(float);
#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)

精彩图集

赞助商链接