首页 > 其他分享 >C语言 -运算符

C语言 -运算符

时间:2024-11-27 23:34:11浏览次数:11  
标签:运算 int C语言 运算符 类型 表达式 赋值

运算符

各类数值型数据间的混合运算

  • 整型、实型、字符型数据间可以进行混合运算

    运算时,参加运算的两个数据如果类型不同,则首先将其类型转换成一致再运算,转换规则是:

    将优先级低的类型转换到优先级高的类型,被称作自动类型转换(小转大——不会损失数据)。

大类型类型 变量名 = 小类型变量;

在这里插入图片描述

注意:

​ 在混合运算过程中,系统所进行的类型转换并不会改变元数据类型,只是在运算过程中将其值变成同类型后在运算。

int a = 10;
double c = a + 22.5;// a只是在运算工程中临时将其值变成double,但是a本身并没有改变类型
  • C语言提供了强制类型转换运算,可得到一个所需要类型的数据,强制类型转换的形式为:

    (类型名)(表达式)
    小类型类型 变量名 = (小类型类型)大类型变量;
    
    • (double) a 将a的值转换成double类型

    • (int)(x+y) 将x+y的结果转换为int类型

    • (int)x+y 将x的值转换成int类型后与y进行相加

    • (float)(5%3) 将5%3的值转换成float类型

    特别需要说明的是:在强制类型转换的过程中,并不会改变原变量的类型,只是在运算过程中将其值转换类型后再运算。

    案例
    • 要求:强制类型转换

      #include <stdio.h>
      
      void main()
      {
          float x;
          int i;
          x = 3.6F;//F表示单精度浮点数
          i = (int)x;
          printf("x=%f,i=%d\n", x, i);//x=3.6,i=3 实数转换整数,会丢失小数部分
      }
      

      说明:x仍然为float类型,可见强制类型转换并不改变变量的类型。

      C语言运算符和C算术表达式

      C运算符
      序号名称符号序号名称符号
      1算术运算符+ - * / % ++ –8指针运算符*&
      2关系运算符> < >= <= == !=9字节数运算符sizeof
      3逻辑运算符&& || !10下标运算符[]
      4位运算符>> << ~ | ^ &11强制类型转换运算符(类型)
      5赋值运算符= += -= *= /= %=12分量运算符. ->
      6条件运算符?:13其他函数调用运算符()
      7逗号运算符,
    C表达式

    所谓表达式就是将操作对象用运算符连接起来的符合C语法规则的式子。(运算数加+运算符=表达式)

    序号名称举例说明
    1算术表达式2 + 6.7 * 3.5 + sin(0.5)计算结果是数值类型
    2关系表达式x>0,y<=z+6计算结果是布尔类型,或0和非0
    3逻辑表达式x>0 && y>0计算结果是布尔类型,或0和非0
    4赋值表达式a = 5.6,sum += i;规则:右往左
    5逗号表达式x=3,y+=4,z-=8分隔并列,结果是最后一个表达式的值

C语言规定了运算符的优先级和结核性。在表达式求值时,按运算符的优先级别的高低次序执行。如果运算对象两侧的运算符优先级别相同,如a+b+c,则按照规定的“结合方向”处理。

C语言运算符优先级

在这里插入图片描述

算术运算符

基本的算术运算符

+ 、-:正负值运算符(单目运算符)

+、-、*、/、%:加减乘除取余运算符(双目运算符)注意:进行除法运算的时候,除数是不能为0的,%针对整数。

这些算术运算符的运算顺序与数学上的运算顺序相同。

表达式和运算符的优先级与结合性

算术表达式:是指用算术运算符和括号将运算对象连接起来,符合C语言语法规则的式子。例如:

a * b / c - 1.5 + 'a'
  • 表达式中各种运算符的运算顺序,必要时应添加括号,例如:

    (a+b)/(c+d) != a+b/c+d
    
  • 注意表达式中运算对象的数据类型,特别是整型相除,C语言规定,两个整型相除,其结果仍为整型。例如:

    7/6的值为1
    4/7的值为0
    (1/2)+(1/2)的值为0   (面试题)
    

    优先级与结合性:在表达式求解的时候,先按运算符的优先级别高低次序执行。若一个运算对象两侧的运算符的优先级相同,则按规定的结合方向处理。

    各种运算符的结合方向:

    1.算术运算符的结合方向:“自左向右”,即运算对象先与左边的运算符结合,例如:

    a - b + c // 先执行a - b,然后执行 + c 运算
    

    2.有些运算符的结合方向:“自右向左”,即运算对象先与右边的运算符结合,例如:

    i++
    

    3.若一个运算符两侧的数据类型不同,会自动转换成同类型后进行计算。

自增++、自减–运算符

作用:使变量的值增1或减1

结合方向:“自右向左”

++i/–i

表示在使用该运算符对象之前,先让自身增1/减1,然后再使用它,也就是使用增1/减1后的值。先计算,后使用

例如:语句x = ++n; 相当于以下两句的运算结果:n = n + 1; x = n

int n = 1; // n:1
int x = ++n; //x:2 等价于:n = n + 1; x = n
i++/i–

表示在使用该运算符对象之后,才让自身增1或减1,也就是先使用它的值,在让自身增1或者减1。先使用,后计算

例如:语句x = n++; 相当于以下两个语句的运算结果:x = n ; n = n + 1

int n = 1; // n:1
int x = n++;// x:1 等价于: x = n; n = n + 1

总结:不管是++i还是++i,i自身都增1;同理不管是–i还是i–,i自身都减一,它们的不同之处在于使用的先后顺序

注意:

​ 1.增1与减1运算符只适用于整型或字符型变量,而不能用于其他类型的变量

​ 2.增1与减1运算符不能用于常量或者表达式,;例如:--5(i+j)++等都是非法的。

课堂练习

要求:推导以下表达式的i和n的值

int i = 1;  
int n = i++ + (++i) - (--i) + i--; // 1+2-1+2

赋值运算符

"="称之为赋值运算符,其作用是将一个数据赋值给一个变量。例如:a = 5

执行赋值运算的结果,是将右边的数据存入左边变量对应的内存单元中,赋值运算的顺序:由右向左

赋值规则

如果赋值运算符两侧的类型不一致,则在赋值时要进行类型转换,转换规则为:

  • 实型→整型变量:舍弃小数部分。比如:int a = 5.5; a应该是5
  • 整型→实型变量:数值不变,以浮点形式存储。
  • 字符型→整型变量:放在整型的低8位。保持原值不变原则。比如:int a = ‘A’
赋值表达式

主要实现赋值运算的表达式

语法:

变量 = 表达式

案例:

a = 5;
y = x * 2 + 3;
a = a + 1;

作用:将右边表达式的值赋值给左边的变量。赋值表达式的值取自左边变量的值。

复合赋值运算符

+= -= *= /= %= ...(&=,|=,>>=,<<=,~=,^=)

左右两侧操作完毕后,赋值给左侧的变量,例如:

a += 3; // 等价于 a = a + 3
int c = 2;
a /= c; //等价于 a = a / c
// .. 其他复合运算符都是类似的

注意:

​ 1.在运算时,不能将单等号(=)写作双等号(==)

​ 2.赋值运算符的优先级属于最低(除了逗号运算符以外)一般最后运算

关系运算符

< > <= >= == !=

  • 所有的关系运算符都是二元运算(二目运算),左侧和右侧可以是变量,也可以是常量,还可以是表达式

    举例:a > b , 5 > 6 , a+b > c

  • 关系运算符运算的结果是布尔类型,要么为真(非0,ture),要么为假(0,false)

说明:

1.标准C中没有布尔类型的,非0代表真,0代表假

​ while(0) 循环一次都不执行

​ while(1) 死循环,无限循环

2.真在输出的结果为1,假在输出的结果为0

​ printf(“%d\n”, 3 < 2); //结果为0

​ printf(“%d\n”, 3 > 2); //结果为1

​ 说明:用作条件判断的时候,非0代表真,但系统输出真的结果是1

注意:

​ 1.算术运算符的优先级高于关系运算符 例如:2 + 3 > 1+1 // 5 > 2

​ 2.关系运算符是二元运算符,不要连用 例如:5 > a > 1 (恒等于0) 3 < b < 10(恒等于1) 可以编译和运行,不报错,无意义

​ 前面案例正确的写法: a < 5 && a > 1 , b > 3 && b < 10

​ 3.不能将 == 写成 = ,==:关系运算符,=:赋值运算符

浮点型比较

​ 4.一般浮点型进行比较建议将两个数相减,结果和0进行比较,如果等于0,表示这两个浮点数相等。

​ 案例1:

​ float a = 22.2

​ float b = 22.2

​ a == b 结果为真; a != b 结果为假 // 哪怕正确也这样做,应该的做法:a - b == 0

​ 案例2:

​ float x = 2.0

​ float y = 11.1 // 近似存储:11.099995(不一定,近似)

​ float z = x * y // 实际是:22.1999

​ z == 22.2 结果为假

​ 两个浮点数的比较:两个浮点数相减跟0比较

​ a - b == 0 结果是真,说明a等于b;如果是假,a不等于b

​ a - b == 0.000001; 结果是真,认为的认为0.000001的误差能够接受,我们也认为 a 等于 b

逻辑运算符

运算的结果要么是真(1),要么是假(0)

!:非(逻辑非)单目运算符,并且只能放在操作数的左侧;非真即为假,非假即为真。(取反)

​ 对一个数或者表达式取非奇数次,结果与原值相反,!(a % 2 != 0) 求偶数 等价于 (a % 2 == 0)

​ 对一个数或者表达式取非偶数次,结果与原值相反,!(a % 2 == 0) 取奇数次

&&:与(逻辑与)双目运算符,当左右两侧的数据都为真时,最终的结果才为真(有假则为假)11 = 1, 10 = 0, 01 = 0

​ 当逻辑与运算时,左侧为假,右侧结果不会影响最终的结果,右侧压根就不会执行,最终结果为假,这种现象为短路效果(短路与)

||:或(逻辑或)双目运算符,当左右两侧的数据都为假时,最终结果财位假(有真则为真)00 = 0,01=1,10=1

​ 当逻辑或运算时,左侧为真,右侧的结果不会影响最终的结果,右侧压根不会执行,最终结果为真,这种现象称为短路效果(短路或)

惰性运算

所谓的惰性运算,就是减少运算次数

  • 短路与:&&两边的操作数,只要左边不成立0,

逗号表达式

作用:将若干个表达式”串联“起来,如:3+5,6+8;

别称:顺序求值运算符

逗号表达式

语法:

表达式1,表达式2,...,表达式n

求解过程:按从左到右的顺序分别计算各表达式值,其中最后一个表达式n的值就是整个逗号表达式的值。

位运算

说明:按位(bit)来进行运算操作的运算符。

语法:~ & | ^ << >>

按位取反:~

说明:单目运算符,数据的每一个bit位取反,也就是二进制数位上的0变1,1变0

举例:

unsigned char ret = ~0x05;// 0000 0101 --> 1111 1010
printf("%d\n", ~5); // -6  //%d:有符号十进制int, %u:无符号十进制int
按位与:&

运算规则:对左右操作数据,只有相应二进制位数据都为1时,结果数据对应数据为1,简单来说:

你是1,我是1,结果就是1

举例:

5 & 6 = 4    // 0000 0101 & 0000 0110 = 0000 0100

作用(4阶段):

​ 1.获取某二进制位的数据

​ 2.将指定二进制数据清零

​ 3.保留指定位

按位或:|

运算规则:对应左右操作数,只要相应二进制数据有一个未1,结果数据对应位数据为1,简单来说:

你是1 或 我是1 结果就是1

举例:

5 | 6 = 7   // 0000 0101 | 0000 0110 = 0000 0111

作用:

​ 1.置位某二进制位数据

按位异或:^

运算规则:对于左右操作数据,只要相应二进制数据相同,结果数据位数据为0,不同为1,简单来说:

举例:

s | 6 = 3  // 0000 0101 | 0000 0110 = 0000 0011

作用:

​ 1.翻转

​ 2.值交换

面试题:

在这里插入图片描述

左移,按位往左偏移:<<

运算规则:原操作数所有的二进制位数向左移动指定位;

无符号左移:

语法:操作数 << 移动位数

unsigned int a = 3 << 3; // 计算规则:3 * 2^3
unsigned int b = 5 << 4; // 计算规则:5 * 2^4
printf("%d", a);//24

有符号左移:

语法:操作数 << 移动位数

int a = -3 << 3;  // -3 * 2^3
printf("%d", a);// -24

注意:

  • 如果移出的高位都是0,我们可以这样理解:a<<n,可以看作是:a * 2^n
  • 如果移出的高位都是1,我们是不能使用上面的计算公式的。
右移,按位往右偏移:>>

运算规则:原操作数所有的二进制数据向右移动指定位,移出的数据舍弃。

如果操作数是无符号数:左边用0补齐

如果操作数是有符号数:左边用什么去补全,取决于计算机系统:

  • 逻辑右移:用0补全
  • 算术右移:用1补全

大部分情况下,系统是遵循”算术右移”的

无符号右移:

  • 语法:操作数 >> 位移数

    unsigned char a = 3 >> 3;
    printf("%d\n", a); // 0
    

有符号右移:

语法:操作数 >> 位移数

char a = -3 >> 3;
printf("%d\n", a); //不一定,看是那种位移,算术位移是 -1

标签:运算,int,C语言,运算符,类型,表达式,赋值
From: https://blog.csdn.net/weixin_70953765/article/details/144066874

相关文章

  • 初识c语言+getchar()和putchar()相关知识
    编译和链接C语言是一门编译型计算机语言,源代码都是文本文件,本身无法执行,必须通过编译器的编译和链接器的链接生成二进制的可执行文件才能执行。一个工程一般多个源文件组成。1.每个源文件(.c)单独经过编译器处理生成对应的目标文件(.obj为后缀的文件)。2.多个目标文件和库......
  • C语言学习笔记-4
    四、控制语句1.选择控制语句1、if语句1)if(){语句1;语句2;}如果条件成立执行大括号里的所有语句,不成立的话大括号里的语句不执行2)if(条件表达式){}else{}如果if的条件成立,执行if后面{}内的语句,否则执行else后的语句3)if(条件表达式1)......
  • C语言——指针初阶(一)
    目录一.什么是指针???     指针是什么?        指针变量:        总结:        总结:二.指针和指针类型指针+-整数:        总结:指针的解引用总结:三.野指针如何规避野指针往期回顾:一.什么是指针???     指针是什么? ......
  • C语言中对文件的输入输出
    在c中的文件操作通过读的形式,打开文件用FILE打开用FILE*类型的指针接受文件指针的首地址并且我们可以用读或写的方式打开文件使用r来读取文件当然也要判断是否读取文件成功,若读取成功fopen会传出指针,若失败则会传出空指针,所以要判断读取是否成功当然,当文件不存在时使用r会......
  • 零基础C语言-插入排序
    插入排序插入排序是排序算法当中一种很基础的算法,同时他也我们日常生活当中所见到最多的排序。比如我们在拿扑克牌的时候,所用的排序方法就是将手中刚刚拿到的牌放入一个比前边大后边小的位置,直接插入进去,这就是插入排序。所以我们要对插入排序进行实现我们就要进行代码......
  • C语言实例之10求0-10000中的水仙花数
    1.水仙花数的描述水仙花数(Narcissisticnumber)也被称作自恋数、自幂数等。它是指一个三位数,其各位数字的立方和等于该数本身。例如,153是一个水仙花数,因为13......
  • 【C语言】· 第五讲 · Printf 与 Scanf 学习笔记
    Printf与Scanf一、printf1、 基本⽤法printf()的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的f代表format(格式化),表⽰可以定制输出⽂本的格式。printf()不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换⾏。为了让光标移到下⼀⾏的开头......
  • 【C语言的奥秘6】函数知识点总结最全
    一、什么是函数程序是由多个零件组合而成的,而函数就是这种“零件”的一个较小的单位。也可以叫子程序。在计算机科学中,子程序是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。一般会有输入参数并有返回值,......
  • C语言动态内存管理的讲解
    一、动态内存为何存在在动态内存管理之前,我们已经学过了在栈空间开辟内存的方式:inta=4;(在栈区开辟四个字节的空间)chararr[10];(在栈区开辟10个字节的连续空间)这些开辟空间的方式有两个特点:(1)空间开辟的大小是固定的;(2)数组在申明的时候,必须指定数组的长度,数组空间大小......
  • C语言:基本数据类型
    整型数据        用来存放整型数据的变量我们定义一个整型的变量,C编译系统实际是在内存中分配了能够存储一个整型数据的存储空间,并用变量名来标识这个空间,对该空间的使用也就可以通过变量名来访问。若不知道你所用的C编译系统对变量分配的存储空间的大小,可用sizeof......