运算符及表达式

表达式和赋值

首先,我们来看一下运算符的优先级

运算符优先级
运算符的优先级:这个表中囊括了单目运算符,双目运算符及三目运算符的优先级(1级最高,14级最低)。
运算符的结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。

接下来我为大家讲述运算符以及表达式


1.算术运算符以及算术表达式

(1)算术运算符:+、-、*、/、%、++、–;

注意:求余运算符(模运算符)“%”参与运算的变量均为整型,除法运算符“/”当运算量均为整数时输出也为整数,当运算量中有一个是实型,则结果是双精度实型。

(2)算术表达式:是由算术运算符和操作数组合成的式子,算术表达式用于各类数值运算。除求余运算符%之外,运算对象可以是整型,也可以是实型。

(3)算术运算符在算术表达式之中的优先级

括号运算符的优先级最高(),所以当表达式之中存在括号运算符的时候先进行运算。
我们先来看一些问题帮助我们理解之中的优先级。

int a = 4, b = 5, c = 6, d;
d = a - b + c;//d = 5
d = a - (b + c);//d = -7 因为括号运算符的缘故导致b与c先进行了相加,再进行减法运算

取模运算符%也可以通过乘除来实现

5 % 3 等价于 5 - (5 / 3) * 3(先取出整数,再乘,然后再相减)

接下来我们来看一看自增和自减运算符

int i = 1, j = 1, a, b
a = i++ + i++;//a = 2 , i = 3 因为这里使用的是后自增运算符这时先用i进行相加再进行自增
b = ++j + ++j;//b = 6, j = 3 因为这里使用的是前自增运算符这时先用j进行自增再进行相加运算

在这里有些同学一定认为自己已经理解了,那么我们再尝试一道题

int i = 1, j = 1, a, b;
a = i++ + i++ + i++;//i = 4
b = ++j + ++j + ++j;//j = 4

大家猜一猜这个的结果是什么
是 a = 3, b = 12?
对了一半,b回答错了
b = 10
对于i++我们已经没有问题了那么现在就让我告诉你j++在这里是如何处理的吧
表达式中除了运算符优先级还存在结合性,在 ++j + ++j + ++j中存在两个同级的+运算,根据+运算符的左结合性,在编译时则是这样处理(++j + ++j)+ ++j,也就是(3 + 3)+ 4,所以得出结果才是10

2.赋值运算符及赋值表达式

(1)赋值运算符:赋值运算符用“=”表示,作用是将一个数据赋给一个变量

(2)赋值表达式:由赋值运算符“=”将一个变量和一个表达式连接起来的式子称为赋值表达式,其一般形式为 变量=表达式。

(3) 通过赋值表达式达到类型转换:在对赋值表达式求解过程中,如果赋值运算符两边的数据类型不一致,赋值时要进行类型转换。转换原则以“=”左边变量为准

(4)复合的赋值运算符

复合的赋值运算符有:+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=;
a += 3 等价 a = a+3;
a -= 3 等价 a = a-3;
a *= 3 等价 a = a*3;
a /= 3 等价 a = a/3;
a %= 3 等价 a = a%3;
a <<= 1 将左边数的二进制各位向左移1个
a >>= 1 将左边的二进制数各位向右移1个,移到右端的低位被舍弃
a &= 1 将两个数按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。
a ^= 1 参与运算的两个量按照对应的位进行异或运算,且0^0→0, 0^1→1, 1^0→1, 1^1→0此外,一个数与0异或仍保持不变,即a^0=a一个数与自己异或结果为0,即a^a=0;
a |= 1 参与运算的两个量按照对应位进行或运算,且0|0→0, 0|1→1, 1|0→1, 1|1→1

赋值运算符的应用:
a = b = c = 5 等价于 a = (b = (c = 5));

当a = 12 时请计算 a += a -= a *= a
其实这个式子由于结合性的原因是从右至左计算 则顺序是 a *= a ,a -= a,a += a所以无论a是何值结果都是零。  
int a = 3,b = 5 ;
    a ^= b;
    b ^= a;
    a ^= b;//a = 5, b = 3
这样就实现了a与b的互换

3.逻辑运算符及逻辑表达式

(1)逻辑运算符:&&、||、!

a b a&&B a||b !a
true true true true false
true false false true false
false true false true true
false false false false true

(2)逻辑表达式:用逻辑运算符连接关系表达式或其他任意数值型表达式就构成逻辑表达式。

应用:
     int a = 1,b = 2;
     int c = a++ > 0 || b++ > 0;
     大家可以猜测一下a和b的值,有的同学一定认为是a = 2, b = 3,但是这是错误的当a++>0成立的时候或运算符就不再继续往下运行,所以最后的答案是a = 2,b = 2。
     int a = 1,b = 2;
     int c = a++ < 0 && b++ < 0;
     当然与运算符也是相同的,当与运算符判断第一个式子不成立的时候他便不再继续往下运行,所以最后的答案是a = 2,b = 2。
     !a || a == b 等价于 (!x)||(a == b)

4.条件运算符与条件表达式

(1)条件运算符:由“?”和“:”构成, 并且 是一个三目运算符。

(2)条件表达式:格式一般是 表达式1?表达式2:表达式3。

应用: int i = 1;
      (i>1)? i++:i--;//i = 0

      int a =2,b = 5 , c = 2,d = 3,max;
      max = a>b ? a : c>d ? c : d;//max = 3
      那么也就是先判断a>b为假,执行冒号之后的表达式c>d?c:d,判断c>d为假,将冒号后的表达式赋给max。

5.逗号运算符与逗号表达式

(1)逗号运算符:用“,”将两个表达式连接起来

(2)逗号表达式:一般形式为 表达式1,表达式2 求解过程为先求解表达式1再求解表达式2,整个逗号表达式的值为表达式2的值。

应用:
        a = 3*5,a*4;
        假设a的初值为3,有同学可能认为 a = a * 4,则a = 12:另一种则是 a = 3*5 是一个 a*4 是一个。然而这两种都是错的。正确的是先求解 a = 3*5 ,再求解 a * 4 ,得60,60作为整个表达式的值。
        x = (a = 3, 6 * 3);
        先将3赋给a,在将3*6赋给x,最终得到x=18。
        x = a = 3, 6 * a;
        先将3赋给a然后将a赋给x,最后将6*a作为整个表达式的值。

猜你喜欢

转载自blog.csdn.net/qq_39159168/article/details/78305528