C语言之操作符

简介: C语言之操作符

算术操作符

算术操作符:+ - * / %
1 . 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。

  1. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
  2. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。

移位操作符

**注:移位操作符的操作数只能是整数。

    对于移位运算符,不要移动负数位,这个是标准未定义的。**

左移操作符

左移操作符:<<
移位规则:左边抛弃、右边补0
左移一位就可以把原数乘以2

#include<stdio.h>
int main()
{
    int a = 2;
    int b = a << 1;
    printf("%d", b);
    return 0;
}

在这里插入图片描述

右移操作符

右移运算符:>>
左移一位就可以把原数除以2
首先右移运算分两种:

  1. 逻辑移位 : 左边用0填充,右边丢弃
  2. 算术移位 : 左边用原该值的符号位填充,右边丢弃

位操作符

位操作符: & ^ |
& : 按位与:转化为2进制后相同位置数有0则为0
| : 按位或:转化为2进制后相同位置数有1则为1
^ : 按位异或 :转化为2进制后相同位置相同则为0相异则为1

注:他们的操作数必须是整数。

#include <stdio.h>
int main()
{
    int num1 = 3;
    int num2 = 5;
    int a = num1 & num2;
    int b = num1 | num2;
    int c = num1 ^ num2;
    printf("%d\n", a);
    printf("%d\n", b);
    printf("%d\n", c);
    return 0;
}

在这里插入图片描述
在这里插入图片描述
练习:不能创建临时变量(第三个变量),实现两个数的交换

#include <stdio.h>
int main()
{
    int a = 10;
    int b = 20;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a = %d b = %d\n", a, b);
    return 0;
}

在这里插入图片描述
这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质:

1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0
2.任意一个变量X与0进行异或运算,结果不变,即X^0=X
3.异或运算具有可结合性,即a^b^c=(a^b)^c=a^(b^c)
4.异或运算具有可交换性,即a^b=b^a

赋值操作符

复合赋值符

+=

  *= 
         /=
                %=  
                      >>=  
                            <<= 
                                  &=   
                                      |=      
                                        ^=  
x = x+10;
与下面相同
x += 10;//复合赋值
//其他运算符一样的道理。这样写更加简洁。

单目操作符

在这里插入图片描述

关系操作符

在这里插入图片描述

逻辑操作符

&& 逻辑与 一假则假,全真为真
|| 逻辑或 一真为真,全假为假

#include <stdio.h>
int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}
//程序输出的结果是什么?

在这里插入图片描述

条件操作符

a?b:c
若语句a为真则执行语句b否则执行语句c

表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作数在求值的过程中可能需要转换为其他类型。

隐式类型转换

C的整型算术运算总是至少以缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
整形提升的意义:

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度,同时也是CPU的通用寄存器的长度。 因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长 度。 通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令 中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转 换为int或unsigned int,然后才能送入CPU去执行运算。

如何进行整体提升:

整形提升是按照变量的数据类型的符号位来提升的

算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类 型,否则操作就无法进行。下面的层次体系称为寻常算术转换。
在这里插入图片描述

如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。

操作符的属性

复杂表达式的求值有三个影响的因素:

  1. 操作符的优先
  2. 操作符的结合性
  3. 是否控制求值顺序。

两个相邻的操作符先执行哪个?

取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。 操作符优先级

在这里插入图片描述

相关文章
|
3月前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
74 0
|
3月前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
258 0
|
29天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
35 10
|
1月前
|
存储 编译器 C语言
【C语言】简单介绍进制和操作符
【C语言】简单介绍进制和操作符
161 1
|
1月前
|
存储 编译器 C语言
初识C语言5——操作符详解
初识C语言5——操作符详解
174 0
|
3月前
|
C语言
C语言操作符(补充+面试)
C语言操作符(补充+面试)
45 6
|
3月前
|
存储 编译器 C语言
十一:《初学C语言》— 操作符详解(上)
【8月更文挑战第12天】本篇文章讲解了二进制与非二进制的转换;原码反码和补码;移位操作符及位操作符,并附上多个教学代码及代码练习示例
59 0
十一:《初学C语言》—  操作符详解(上)
|
4月前
|
C语言
五:《初学C语言》— 操作符
本篇文章主要讲解了关系操作符和逻辑操作符并附上了多个代码示例
44 1
五:《初学C语言》—  操作符
|
5月前
|
C语言
C语言逻辑操作符的短路问题
C语言逻辑操作符的短路问题
|
5月前
|
编译器 C语言
【C语言】:中移位操作符,位操作符详运算规则详解
【C语言】:中移位操作符,位操作符详运算规则详解
44 1