您的位置:首页 > 编程语言 > C语言/C++

【C++学习笔记】06_运算符与表达式

2014-06-22 11:29 351 查看
运算符与表达式
运算符,顾名思义,指的是具有运算意义的符号,比如加运算符(+),减运算符(-)等,表达式,是C++编译器能读懂的计算机语句,由运算符和操作数按一定语法规则组合而成,根据运算符决定对操作数进行何种运算,并得出唯一的运算结果。

C++提供的运算符有以下几种:算术运算符、关系运算符、逻辑运算符、位运算符、条件运算符、赋值运算符、逗号运算符、sizeof运算符及其它运算符。同时,按照操作数的个数,运算符又可以分为单目运算符(1个操作数)、双目运算符(两个操作数)和三目运算符(3个操作数)。



【算术运算】



注意: 取余操作(%)要求两个操作数都为整型数值!

余操作(%)和除操作(/)都要求被除数不可以为0!

代码示例:



运行结果:



注意:使用整型进行除运算会有较大的误差

修改代码:



运行结果:





【逻辑运算】

对简单电路有所了解的人可能更容易理解逻辑(与或非)的概念,C++中提供了3个逻辑运算符,分别是:

&&(“与”),||(“或”),!(“非”)

其中,!为单目操作符,结合顺序为从右向左,&&和||为双目运算符,结合顺序为从左向右,逻辑运算符要求其操作数为bool型,即有true和false两种取值,但实际上,借助

于C++的类型转换机制,普通的数值量也可以进行逻辑运算,非0量转换为true,0转换为false。逻辑运算返回一个bool型量,表2.6为操作数的值与逻辑表达式的值之间的关系。





【短路表达式】

在由&&和||运算符组成的逻辑表达式中,C++规定:只对能够确定整个表达式值所需要的最少数目的子表达式进行计算。也就是说,当计算出一个子表达式的值后便可确定整个逻辑表达式的值时,后面的子表达式就不需要再计算了,这种表达式也称为短路表达式。

如果下列条件满足:

在逻辑与表达式“表达式1 &&
表达式2”中,表达式1为false;

在逻辑或表达式“表达式1 ||
表达式2”中,表达式1为true;

则保证不会计算表达式2。

来看下面的语句:

inta=0,b=3;

a &&(b++);

表达式a为0,则判定为false,由于&&逻辑运算,所以后面的就不用再计算了,后面的b++的自增运算也不会再继续下去。



【关系运算】





注意: 表达整型变量是否为0?

应当使用“==”或“!=”来表达,即num==0或num!=0

表达浮点型变量是否为0?

无论是float还是double变量都存在着精度的限制,所以应该尽量避免与数值精准的“==”和“!=”做比较。应该用“>=”或“<=”的形式做比较。

例子:((num<=delta)&&(num>=delta));

这个方法适用于浮点类型变量和0做比较,其他类型的变量也适用。

Bool类型不用做比较

Bool本身就只有true和false两种值,进行判断是,一般true返回的是1,false返回的是0,所以一般是不用比较的,例子:假设isok是布尔型变量

If(isok){********}或者if(!isok){********}



【条件运算】

条件运算符是C++中唯一一个三目运算符,条件表达式的一般形式为:

S1? S2 : S3;

其含义为:若S1为true,则条件表达式取S2的值,否则,取S3的值,条件运算符的优先级比赋值运算符略高。

min=A>B? B : A;

上面例句的意义为:如果A大于B成立(true),变量min取值为B,否则,变量min取值为A。恰当地使用条件运算符可以写出精炼的C++语句。



【位运算】

无论在什么情况下,数据都是由0和1来存储的,这就是数据的机内表示,有时按位操作数据是很必要的,可就是说,程序员可能希望通过改变内存中某单元的某一位来改变其值,这就是位运算的由来。C++中的位运算符有以下两类:

位逻辑运算符:&(位“与”)、^(位“异或”)、|(位“或”)、~(位“取反”);

移位运算符:<<(左移)、>>(右移)。

下面分开进行介绍,首先来看<<和>>,可能有的读者会说,这不是前面代码中经常出现的、跟在cin和cout后面的输入输出符么,没错,但它们在这里起的是移位的功能,而不是用来输入输出。

代码例子:



运行结果:



在示例中,可以看出,C=A<<3,A的十进制值为521,转换为二进制机器码,就是1000001001,short类型A占用两个字节,每个字节8位,所以是0000001000001001,“A<<3”代表每一位都向左移动3位,空位用0补齐,所以结果的二进制机器码就是:00010000 01001000,那么结果十进制就是:4168。

注意:

对于空白位补0这一操作是针对无符号数或者有符号正数而言的,而对于有符号的负数,编译器会对其进行特殊处理。



位取反运算:

即是对一个数的各位都进行非运算,比如:

0001000001001000

1110111110110111



位“与”、位“或”、位“异或”:

代码示例:



运行结果:



下面看看异或的处理,修改程序:



运行结果:



就是相同为0,不同为1。



注意:和移位运算不同,位“反”、位“与”、位“或”、位“异或”都不会介意处理对象的符号问题,符号位会被当成单纯的“0”和“1”来处理。



【赋值运算】

由赋值运算符组成的表达式为赋值表达式,赋值运算符的结合性是由右至左,因此,C++程序中允许出现连赋值的情况。

intA,B,C,D,E;

A=B=C=D=E=9;

上述语句是合法的,整型变量A、B、C、D和E都被赋值为9。

讨论到赋值运算,有必要提及程序实体和左值这两个概念,程序实体是内存中的一块可标识的区域,左值是左值表达式的简称,是指明一个程序实体的表达式。判断一个表达式是否左值的方法是看其能否放在等号的左边。

如“float a;”声明了一个浮点型变量a,则a是左值,因为它指明了一个程序实体,可放在赋值号的左边,但表达式“a+3”和“a=1”就不能放在赋值号的左边,不是左值。



【++and--】

对于表达式“x=x+1;”、“x=x-1”(或写为“x+=1”、“x-=1”),有种更简洁的写法“x++”(或“++x”)、“x--”(或“--x”)。“++”、“--”称为加1运算符和减1运算符,它们都是单目运算符,优先级高于任何双目运算符,结合性为从右到左。

“ ++” 和“ --” 多有两种形式:前缀形式(“ ++x” 、“ --x” )和后缀形式(“x++”、“x--”)。前后缀运效果是不同的。

例子示例:



运行结果:



从代码和运行结果上看就可以看出“B=A++”是A先赋值给B再自增+1。

而“B=++A”是A先自增+1,然后再赋值给B的。



注意:

“x++”和“x--”这样的写法都不是左值,前面已经讲过什么是左值,是左值表达式的简称,是指明一个程序实体的表达式。判断一个表达式是否左值的方法是看其能否放在等号的左边。但是“++x”和“--x”是左值,可以放在等号的左边,像“++++x”的写法是正确的。



【逗号表达式】

逗号表达式由用逗号分割的一组表达式组成,这些表达式从左向右计算,逗号表达式的结果是最右边表达式的值,其类型也是最后一个表达式的类型。

代码2-15是逗号表达式的使用范例,其中“A++,--B,A*B”是逗号表达式,按照从左到右的顺序分别进行对A的加1操作(后缀++)、对B的减1操作(前缀--)、A和B相乘,并将最后一个表达式(A*B)的值返回,赋值给C。

代码示例:



运行结果:





【sizeof运算符和sizeof表达式】

sizeof是个单目运算符,用来计算操作数在内存中占据的字节数,其操作数既可以是括在圆括号中的类型标识符,其返回值是size_t类型,即无符号整数,如:

sizeof(short);//返回2

sizeof(long); //返回4

sizeof(int); //

不确定,取决于不同的系统

也可以是一个表达式,如:

short x;

sizeof(x); //

返回2

代码示例:



运行结果:





【运算符的优先级】

总的来说,有以下几点规律:

操作数多的运算符优先级别相对低一点,从高到低:单目→双目(不包含赋值运算符)→三目→赋值→逗号;

双目运算符个数最多,双目运算符优先级从高到低依次为:算术运算符→比较运算符→位运算符→逻辑运算符;

算术运算符中,*、/、%的优先级高于+、-;

位运算符优先级从高到低为:~→&→^→|;

逻辑运算符优先级从高到低为:!→&&→||;

赋值运算具有相同的优先级。

二元操作符的潜在缺点:

二元操作符左右操作数的计算顺序并没有在C++中明确的表示,所以有以下情况:

IntA =5,B;

B=(A=2)+(++A);

若先执行“A=2”那么结果就是5;

若先执行“++A”那么结果就是8;

不过程序可以这样改:

A=2;

++A;

B=A+A //或者B=2*A;



一些错误的理解:

1. 如果A为0,则对A加1,否则对A 加10;

A==0? A+=1 :A+=10; 错误

编译器会这么想:

(A==0? A+=1 : A)+=10

应该这么写:

A==0? (A+=1) : (A+=10) 正确



2. 判断A、B、C是否相等

A==B==C

编译器会这么认为:

A==(B==C)

赋值符是从右到左的,上面的语句在A=0同时B不等于C的时候,也是返回“true”

应该这么改:

(A==B)&& (A==C) && (B==C)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: