C语言学习(三)之操作符


一、 算数操作符

操作符 解释 说明
+ 加法操作符 a+b=c
- 减法操作符 a-b=c
* 乘法操作符 a*b=c
/ 除法操作符 a/b=c
% 取余操作符 a%b=c,取余操作符的左右都必须是整型

二、移位运算符

位操作符包括右移和左移。只能作用于整数。
右移操作符包括算术右移和逻辑右移

1、算术右移为:右边丢弃,左边补原符号位
2、逻辑右移为:右边丢弃,左边补0

左移为左边丢弃,右边补0

操作符 解释 说明
>> 右移操作符 移动的是二进制位。a >> 1,右移一位相当于除以2
<< 左移操作符 移动的是二进制位。a << 1,左移一位相当于乘以2

注意:对于移位运算符,不要移动负数位,这个是标准未定义的。例如:

int num=10;
num >> -1; // 错误

三、位操作符

操作符 解释 说明
& 按位与 按二进制位运算,同为1则为1,反之为0
| 按位或 按二进制位运算,有1则为1,同为0则为0
^ 按位异或 按二进制位运算,对应位相同为0,相异为1

注意:它们的操作数必须是整数

& 运算示例:

#include <stdio.h>

int main(){
    
    

int a = 3;  // 00000000000000000000000000000011为3的二进制形式
int b = 5;  // 00000000000000000000000000000101为5的二进制形式

int c = a&b; //&运算后的c为:00000000000000000000000000000001 结果为1

printf("%d", c); // 结果为1

    return 0;
}

| 运算示例:

#include <stdio.h>

int main(){
    
    

int a = 3;  // 00000000000000000000000000000011为3的二进制形式
int b = 5;  // 00000000000000000000000000000101为5的二进制形式

int c = a|b; //|运算后的c为:00000000000000000000000000000111 结果为7

printf("%d", c); // 结果为7

    return 0;
}

^ 运算符示例:

#include <stdio.h>

int main(){
    
    

int a = 3;  // 00000000000000000000000000000011为3的二进制形式
int b = 5;  // 00000000000000000000000000000101为5的二进制形式

int c = a^b; //^运算后的c为:00000000000000000000000000000110 结果为6

printf("%d", c); // 结果为6

    return 0;
}

3.1 交换变量的值

在不借助第三个变量的情况下,交换两个变量的值

#include <stdio.h>

int main(){
    
    

int a = 3;  // 00000000000000000000000000000011为3的二进制形式
int b = 5;  // 00000000000000000000000000000101为5的二进制形式

printf("交换前:a=%d, b=%d\n", a, b);

// a^b的结果为:00000000000000000000000000000110 十进制为:6,此时a等于6。
a = a^b; 
// 此时a等于6,二进制为:00000000000000000000000000000110 
//     b等于5,二进制为:00000000000000000000000000000101
// 再次与b异或的结果为:00000000000000000000000000000011 十进制为:3
// 将结果赋值给b,此时b的结果为3
b = a^b;    
// 此时a等于6,二进制为:00000000000000000000000000000110 
//     b等于3,二进制为:00000000000000000000000000000011
// 再次异或的结果为:00000000000000000000000000000101 十进制为:5
// 将结果赋值给a,完成a与b的交换
a = a^b;

printf("交换后:a=%d, b=%d", a, b); // 结果a为5,b为3

    return 0;
}

四、赋值操作符

赋值操作符其实就是一个等号 “=”,在程序中一个等号代表赋值操作符,而两个等号 “==”则表示等号。

操作符 解释 说明
= 赋值运算 表示右边的值赋给左边,而不是左边的值等于右边的值
int a = 3;  //表示将3赋值给a,此时a的值就是3

五、复合操作符

操作符 解释 说明
+= 加等于 a += b相当于a= a + b
-= 减等于 a -= b相当于a= a - b
*= 乘等于 a *= b相当于a= a * b
/= 除等于 a /= b相当于a= a / b
%= 取模等于 a %= b相当于a= a % b
>>= 右移等于 a >>= b相当于a= a >> b
<<= 左移等于 a<<= b相当于a= a << b
&= 与等于 a &= b相当于a= a & b
|= 或等于 a |= b相当于a= a | b
^= 异或等于 a ^= b相当于a= a ^ b

六、单目操作符

6.1 操作符介绍

操作符 解释 说明
逻辑反 真变成假,假变成真。如果a为真,则 !a为假
- 负值 -1,-3等
+ 正值 +1, +3等
& 取地址 &a表示取出a变量的地址
sizeof 操作数的类型长度 以字节为单位
~ 对一个数的二进制按位取反 看示例
- - 自减 前置、后置- -
++ 自加 前置、后置++
* 间接访问操作符(解引用操作符) 看示例
(类型) 强制类型转换 (int)float_num

6.2 操作符示例

6.2.1 * 解引用操作符的示例

#include <stdio.h>

int main(){
    
    

int a = 10;

int* p = &a; //将a的地址赋值给指针变量p
*p = 20;  // *为解引用操作符。表示通过p找到a

printf("a的值为:%d", a);   //a的值为20

    return 0;
}

6.2.2 ~ 取反操作符示例

#include <stdio.h>

int main(){
    
    

int a = 0;

// a的二进制为:00000000000000000000000000000000
// 11111111111111111111111111111111 为a的补码
// 11111111111111111111111111111110 反码
// 10000000000000000000000000000001 源码值为-1
printf("a的值为:%d", ~a);   //a的值为-1

    return 0;
}

6.2.3 自加自减

分类:

前自增	-- ++i
后自增	-- i++

相同点:最终都使 i 的值加1
不同点:前自增整体表达式的值是 i 加1之后的值。后自增整体表达式的值是 i 加1之前的值。

前- -同理

6.2.3.1 前++使用示例

#include <stdio.h>

int main(){
    
    

int a = 10;

// ++放在前面,先++,后使用
printf("a的值为:%d", ++a);   //a的值为11

    return 0;
}

6.2.3.2 后++使用示例

后- -同理

#include <stdio.h>

int main(){
    
    

int a = 10;

// ++放在后面,先使用,再++
printf("a的值为:%d", a++);   //a的值为10

    return 0;
}

6.2.3.3 综合使用示例

#include <stdio.h>

int main(void)

{
    
    
	int i, j, k, m;
	i = j = 3;
	k = ++i;
	m = j++;
	printf("i = %d j = %d k = %d m = %d", i, j, k, m);
	return 0;
}
i = 4 j = 4 k = 4 m = 3

6.2.4 强制类型转换

语法:

(数据类型)(表达式)

功能:

把表达式的值强制转化为前面所执行的数据类型

在这里插入图片描述

6.2.4.1 强制类型转换示例

#include <stdio.h>

int main(){
    
    

// 3.14为double类型,赋值给int的a精度丢失,且报警告
// 使用(int)3.14可以将3.14强制转换成int类型
int a = (int)3.14;
printf("%d", a);    // a的值为3
    return 0;
}

七、关系操作符

操作符 解释 说明
> 大于 a > b
>= 大于等于 a >= b
< 小于 a < b
<= 小于等于 a <= b
!= 不等于 a != b
== 等于 a == b

八、逻辑操作符

操作符 解释 说明
&& 逻辑与 同为真则为真,有一个为零则为假。当计算出左边为假时,右边不再运算
|| 逻辑或 同为假则为假,有一个为真则为真。当计算出左边为真时,右边不在运算

8.1 逻辑与示例

#include <stdio.h>

int main(){
    
    

int a = 3; // a为非零,则为真
int b = 2; // b为非零,则为真

int c = a && b; // a && b 则同为真则为真,反之为零。

printf("%d", c);	// 结果为:1
    return 0;
}

8.2 逻辑或示例

#include <stdio.h>

int main(){
    
    

int a = 3; // a为非零,则为真
int b = 0; // b为零,则为假

int c = a || b; // a || b 则同为假则为假,有一个为真则为真。

printf("%d", c); // 结果为:1
    return 0;
}

8.3 面试题示例

#include <stdio.h>

int main(){
    
    

int i=0, a = 0, b = 2, c = 3, d = 4;

// 运算a++时,为先赋值再运算,则a等于0。
// 当a等于0时,后面不管什么整个表达式都为假,后面不再运算。
// 然后a再自加1
i = a++ && ++b && d++;
printf("a=%d\nb=%d\nc=%d\nd=%d", a, b, c, d); // 结果a=1, b=2, c=3, d=4

    return 0;
}
#include <stdio.h>

int main(){
    
    

int i=0, a = 1, b = 2, c = 3, d = 4;

// 运算a++时,为先赋值再运算,则a等于1。
// 当a等于1时,后面不管什么整个表达式都为真,后面不再运算。
// 然后a再自加1
i = a++ || ++b || d++;
printf("a=%d\nb=%d\nc=%d\nd=%d", a, b, c, d); // 结果a=2, b=2, c=3, d=4

    return 0;
}

九、条件操作符(三目运算符)

操作符 解释 说明
exp1 ? exp2 ? :exp3 条件操作符 如果exp1为真,则exp2为整个表达式的结果。如果exp1的结果为假,则exp3为整个表达式的结果

9.1 条件操作符示例

#include <stdio.h>

int main(){
    
    

int i = 0, a = 4, b = 3;

// 当a大于b时,输出a,反之输出b
// 相当于:
// if(a > b){
    
    
//     i = a;
// }else{
    
    
//     i = b;
// }
i = a > b ? a : b;
printf("i=%d", i); // 结果为i=4

    return 0;
}

十、逗号表达式

表达式 说明
exp1, exp2, exp3, … expN 逗号表达式就是用逗号隔开的多个表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果

10.1 逗号表达式示例

#include <stdio.h>

int main(){
    
    

int i=0, a = 1, b = 2, c = 3, d = 4;

// 运算a++时,为先赋值再运算,则a等于1。
// 当a等于1时,后面不管什么整个表达式都为真,后面不再运算。
// 然后a再自加1
i = (a > b, a = b + 10, a, b = a + 1); // 逗号表达式
printf("i=%d", i); // 结果i=13

    return 0;
}

十一、结构体成员操作符

操作符 解释 说明
. 结构体成员操作符 结构体 . 成员名
-> 结构体指针操作符 结构体指针->成员名

11.1 结构体成员操作符示例

#include <stdio.h>

// 结构体
struct Student
{
    
    
    char name[20];
    int age;
    char gender[8];
};


int main(){
    
    

    // 创建结构体对象
    struct Student s1 = {
    
    "张三", 12, "男"};

    // 打印其中结构体对象中属性的值
    //s1.gender为取到结构体对象中gender的值
    // 结构体对象.成员名
    printf("%s", s1.gender);    // 结果为:男

    return 0;
}

11.2 结构体指针操作符示例

#include <stdio.h>

// 结构体
struct Student
{
    
    
    char name[20];
    int age;
    char gender[8];
};


int main(){
    
    

    // 创建结构体对象
    struct Student s1 = {
    
    "张三", 12, "男"};

    // 将s1的地址赋值给ps,因为指针变量可以接收地址
    // 所以ps的类型为Student的指针类型,
    struct Student* ps = &s1;
    // -> 操作符可以使指针指向对象的成员属性
    printf("%s", ps->name);    // 结果为:张三

    return 0;
}

十二、转义字符

转义字符,所有的ASCII码都可以用 “ \ ” 加数字(一般是8进制数字)来表示。而C中定义了一些字母前加 “” 来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。

在这里插入图片描述

// \ddd表示1到3位的八进制所代表的任意字符 示例
#include <stdio.h>


int main() {
    
    

	// '\46'在ASCII表中代表的时&,所以输出的结果为:&
    printf("%c\n", '\46'); // 输出结果为:&
    // '\044'在ASCII表中代表的时&,所以输出的结果为:$
    printf("%c\n", '\044'); // 输出结果为:$

    return 0;
}
// \xhh表示十六进制所代表的任意字符 示例
#include <stdio.h>

int main() {
    
    

	// '\x25'在ASCII表中代表的时%,所以输出的结果为:%
    printf("%c\n", '\x25'); // 输出结果为:%
   
    return 0;
}

注意:

  1. 区分,斜杠:“/” 与 反斜杠:“” ,此处不可互换。
  2. \xhh 十六进制转义不限制字符个数 ‘\x000000000000F’ == ‘\xF’ 。
  3. "\n"表示两个字符占用一个字节。其他类似

十三、运算符优先级

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46292926/article/details/127562333