运算符和表达式

运算符:运算符用于执行程序代码运算,会针对一个以上操作数来进行运算。例如:2+3,其操作数是2和3,而运算符则是“+”

操作数:是运[ C ( 1 v S v算符作用于的实体,操作数指出指令执行的操作所需要数据的来源。

表达式:是由数字、运算符、数字分组符号(括号)、自由变量等以能求得数值的有意义排列方法所得的组合。

表达式书写规则

1,运算符不能相邻。例a+-b是错误的

2,乘号不能省略。列x乘以y,应写成x*y,而不是xy

3,可c l c e (用多层括号表示运算次序,括号必须成对出现,均使用小括号。

& y `算符优先级和结合性

所谓优先级就是当一个表达R t w . (* ; Y \ { o 6 Z \中有多个运算符时,先计算谁,后计算谁。这个其实我们在小学学算术的时候就学过,如1+42

那么“结合性”是什么呢?优先级都是关于优先级不同的运算符参与运算时先计算谁后计算谁。但是如果运算符的Y a \ ` . ;优先级相同,那么先计算谁后计算y ( \ *谁呢?这个就是由“结合性”决定的。

比如1+234,乘和除的优先_ 5 n S * p L f i级相同,但是计算的时候是从左往右,即先计算乘再计算除,所以乘和除的结P I V H ! 4 = r ^合性就是从左往右。就是这么简单!

运算o J H i o }符分类

按所需操作数分类:

  • 单目运算符
  • 双目运算符
  • 三目运算符

按作用分类:

算术运算符

单目正负不会改变操作数的值。 int num = 10;

-num;//表达式的值为-10 num还是为10

整数相除会向下取整。 5/2 == 2

5/2.0 == 2.5

取模运算只针对整数。 5%2 == 1

5.2%2//语法错误F I 4 3 L M

赋值运算符

将一个数据(常量或表达式)赋值给一个变量。 inr Q J [ Yt age =18;

age +=2;//age = age +2;

agei p g , | + W G +=5-3;//age = age+(5-3);

关系运算符

  • 关系表达式s 4 /的值只有2种,为真(true)返回1,为/ N N w N = K假(false)返回* : ( F n0。
  • 所谓关系运算,就是做比D p *较,日常生活中经常K Z ! g i遇到一些真假判断,比如说,“张三比李四高”、“济南到北京比济南到上海近”,“5大于2”这些问题的Y R P答案是真或假。程序设计是对实际问题解决过程的模拟,常常需要做判断,n g – G I C , m ,像“如果这样,我就执行动作A,如果那样,我就执行动作B”,那怎么判断n C s Y i这样那样呢,就需要关系运算符和关系表达式。

逻辑运算符

  • 逻辑表达式的值只有2种,为真(trp F f R ] g J /ue)返回1,为假(false)返回0。
  • 一般用来连接关系表达式。

短路现象

在由&&和||运算符组成的逻辑表达式中,C语言有个“节省D E $ F * J n H计算”原则,当计算出一个子表达式的值后便可确定整个K M p逻辑表达式的值时,后面的子表达式就不需要再计算了,这种表达式z m ~ v | \ F也称为短路表达式。

举个例子:

  1. false? ~ k + k G&aW \ X ( + a w = Tmp;&printf("1\n");
  2. true&&printf("2\n"w v t);
  3. false||prin9 } l #tf("3\n"? K ; w 2 z t * {);
  4. true||printf(O q J _ \ /"4\n");
  5. //outpuD 8 Q x F J -t:2
  6. //3

对于&&符号,如果左边表达式为false,则右边表达式不会执行,即不会执行p: p A 9 Vrintf(“1”),如果左边表达式为true,则右边表达式会执行,即会执行printf(“2”),输出2

对于||符号,如果左边为true,则右边表达式\ 9 c OP ~ – 4 $ w D会执行,即不会执行printf(“4”),如果左边表达式为false,则右边表达式会执行,即执行printf(“3”),输出3。

特殊运算符

+ 7 W殊算术运算符

  • 对变量\ ^ Y 1 # % 6 Y 7进行+1和-1的操作。
  • 只能对变量使用,不能用于常量和表达式
  • 前置时是先运算、后使用
  • 后置时是先使~ ~ 2 \ U O ^用、后运算
  • 注意:C T L { i不要嵌套使用
  1. inta=1;
  2. printf("%d",(a+++++a)I U N R I L e ));//1+3

逗号运算符

用逗号将多个表达式连接起来,又称为“顺序求值运| ` % l a算符”。整个表达式的值是+ j I最后那个逗号之后表达式的值。

逗号表达式两种A S F作用:

  • 分割: int a,b,c,d;
  • 求值: int a = (1,3,5,7,9);

int b = 1,3,5,7,9;

条件表达式

条件表达式可以对指定的条件进行判断,true和false分别执行不同的代码。

条件 ?表达式1 :表达式2

  1. printf(5o j B>0?"正数":"负数");
  2. printf((5&g* ] U ~ @ :t;0)?("正数"):("负数"));//为了避R n z $ -免眼花缭乱,可以把每个表Y i O A ^达式都加上圆括号

位运算符

  • 位运算只P m }针对整型和字符型,而且是直接对二进制进行4 8 ( s lH m 9

按位与&

这个符号其实和逻辑与运算 &amph \ 0 z;& 意思一样,B ! W只不过作用在每一位上。

有0则0:对于每一位来说,两个数都是8 p Y B真,则为真,否则为假。

  1. 3->0b00000011
  2. 2->e ! A ~ t e 2 4 J0b00000010
  3. 3&2->0b00000010

按位或|

同理,和逻辑或运算 || 意思一样,只不过作用在1 Q + W [ f S + )每一位上l j ~ M S

d . u1则1:对于每一位来说,但凡有个真的就是真,否则为假。

  1. 3->0b00000011
  2. 2->0b00000010
  3. 3|2->0b00000011

按位异或^

相同为0,不同为1:对于每一位来说,只要. ] w t R M J D M相同就为0,不同就为1。

  1. 3->0b00000011
  2. 2->0b00000010
  3. 3^2->0b00000001

按位取反

取反是一个单目运算符,对每一位进行取反,即E 8 k i 9 $ e F0变1,1a { \ \ D变0

  1. 6->0b% T $ W f00000110
  2. ~6->0b116 ? l g N 8111001//补m ~ | / Z \码:最高位变成了符号位,所以结果肯定是一个负数
  3. 0b10000110//反码
  4. 0b10000111//原码
  5. result:-7

左移

? V k移操作就是把这些0啊1啊n R y J K ` P m的整体往左移动 n 位,右边缺的就补充 0。

  1. 3->0b00000011
  2. 3<<1->0b00000110==6
  3. 2->0b00000010
  4. 2<<20b00001000==8

诶,大家发现没有,左移 1 位之后这个数相当w F \ D Z .于乘2。

但是这只适用于左边溢出的高位中不包含 1( Q v 时。

如果把m j U 6 ; V 1 扔4 p ,了,那就肯定不是 2 倍了嘛。

右移

右移操作就是整体往右移动 n 位,左边缺的补充符号位。

  1. 3->0b00000011
  2. 3>>1->S B ( 0 V i p T C;0b00000001=7 j c e=1
  3. 2->J r Y x @;0b00000010
  4. 2<<20b00000001==1

同理,正数右移操作的效果是: l 4 ^ S j R p V这个数除以 2。

最后

好了` T p # m 3 j t Q,C语言运算符和表达式就介绍到这里,大家可以先练习一S m u n k r _ W a下,后面介绍p F : E @ P复杂的示例。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注