一.导入

在C语言中有许多类型的操作符,掌握这些操作符可以有助于我们更快速的理解代码含义,所以这篇文章将介绍C语言中的操作符

二.操作符的分类

1.算数操作符

+  -  *  /  %
加 减 乘 除 取模

我们先来看一下最基本的加减乘除,示例代码如下:

#include<stdio.h>
int main(void){
	int i = 15;
	printf("%d\n",i+1);
	printf("%d\n",i-1);
	printf("%d\n",i*10);
	printf("%d\n",i/10);
	getchar();
	return 0;
}

上述代码演示了加减乘除这四个基本算数操作符的使用方法,除了除法的运算结果可能与我们预期的不同其它三种运算结果与我们生活中得出的结果是一样的,如图所示:

复习课16 C语言操作符_操作符

这里的我们可能会有疑问为什么 i / 10 的值不等于1.5或者1···5而是 1,其实这里就涉及到了数据类型的问题,该程序中变量 i 的数据类型为int(整型)而1.5为浮点型,所以当我们使用 %d 占位符输出的时候只会输出 商 而不会显示余数,如果要输出浮点数1.5则需要用到强制类型转换,代码如下:

printf("%d\n",i/10); -----> printf("%.1f\n",(float)i/10);

这样我们就可以输出结果了,如图所示:

复习课16 C语言操作符_复习_02

说完这四个基础的操作符我们再来看一个算数操作符 % 取模操作符

看似很难理解的取模操作符 % 其实是很简单的,其作用就是取余数,如以下代码:

#include<stdio.h>
int main(void){
	int i = 15;
	printf("%d\n",i % 10);
	getchar();
	return 0;
}

这里的 i % 10 的值就是将 i / 10 后取其余数的值,这里 i = 15 / 10 后余数等于 5 所以程序输出的值为5,如图所示:

复习课16 C语言操作符_C语言_03

注意:在使用取模操作符的时候两个操作数只能是整数(int),不能是浮点数(float double等)否则出错!


2.赋值操作符

C语言中赋值操作符后很多,这里先介绍几个简单易懂的操作符,涉及二进制的操作符会统一放到后面详细来讲

本章介绍的操作符:

=

我们先来看以下这段代码:

int i = 1;
i = 10;

第一行代码我们称为初始化变量,也就是我们创建了这个变量a的同时给予变量a一个值,而第二行代码则称为赋值,也就是将一个值赋给已经存在的一个变量,这里是将 10 通过赋值操作符 = 赋值给变量 i 

我们再来看一段代码:

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

在数学上 a 是不可能等于 a+10 的,因为这不符合逻辑,但是在C语言中这段代码是合法的,这段代码的意思是将变量 a 先加上 10 再赋值给 a ,所以最后使用printf()函数输出的值应该为 20 ,程序运行结果如下:

复习课16 C语言操作符_操作符_04

我们同样可以将代码写成如下形式:

a += 10;

其效果是一模一样的,如图所示:

复习课16 C语言操作符_复习_05


3.sizeof操作符

1.sizeof操作符属于单目操作符,其作用是计算数据类型所占用的大小,如以下代码就计算了int类型所占内存空间的大小:

#include<stdio.h>
int main(void){
	int a = 520;
	printf("sizeof a = %d\n",sizeof(a));
	printf("sizeof int = %d\n",sizeof(int));
	getchar();
	return 0;
}

程序运行后会分别输出 4  4

解释:第四行钟 sizeof() 操作符作用是变量 a 所占用的内存大小,而变量 a 的数据类型为 int ,而 int类型所占用的内存大小为 4 字节(byte),所以输出 4,第五行则是直接计算 int 类型所占的内存空间,上文已经说过 int 类型占用 4 字节的内存空间,所以也输出 4

注意:sizeof()是操作符而不是函数!当我们需要计算变量数据类型所占内存大小时可以不加括号,如:

sizeof (a);  等价于 sizeof a;

而直接计算数据类型时则必须加上括号,如:

sizeof(int);     //正确
sizeof int;      //错误

4.利用sizeof操作符计算数组总大小、数组元素个数、单个元素大小,如下代码:

#include<stdio.h>
int main(void){
	int arr[10] = { 0 };
	printf("sizeof arr[] = %d\n",sizeof(arr));
	printf("sizeof arr[0] = %d\n", sizeof(arr[0]));
	printf("total number of arr[] = %d\n",sizeof(arr)/sizeof(arr[0]));
	getchar();
	return 0;
}

程序运行结果:40  4  10

解析:

第四行代码作用是计算数组 arr[] 所占用的内存总大小,第三行代码指明了数组中共有10个元素每个元素的数据类型均为 int 类型,所以总大小为: 4 * 10 = 40

第五行代码作用是计算数组 arr[] 中第一个元素所占用内存的大小,因为每一个元素对应的数据类型均为int,所以大小为 4

第六行代码作用是计算数组元素个数,我们只需要用:数组元素总大小 / 数组第一个元素大小

即可计算出数组元素个数,这里是 40 / 4 = 10


5.强制类型转换

当我们敲入如下代码时程序便会抛出一个警告:

int pi = 3.14;

如图所示:

复习课16 C语言操作符_C语言_06

程序告诉我们从double类型转换为int类型可能会丢失数据这是为什么呢?

原因是 3.14 这个数是一个浮点数也就是我们常说的小数,而我们使用的数据类型却是 int 整数类型,很显然 int 只能保留小数点前面的值,而会舍弃小数点后的值,这就会导致数据的丢失,如果我们不想让编译器告警则需要用到强制类型转换,方法如下:

int a = (int)3.14;

这时候 3.14 便会被强制转换为 int 类型,也截断为 3 ,而忽略编译器的告警,但是不建议这样做


6.关系操作符

>        //大于

<        //小于

>=      //大于等于

<=      //小于等于

!=       //不等于

==     //等于

前四个很好理解,我们通过以下一段代码就可以很好的解释其作用,代码如下:

#include<stdio.h>
int main(void){
	int age = 10;
	if (age >= 5){
		printf("hi");
	}
	getchar();
	return 0;
}

我们初始化了一个变量 age 其值为  10 ,随后我们使用if语句对其进行判断,如果 age 的值大于等于5 则调用printf()函数输出 hi ,这里很显然 age 的值大于 5 所以程序会输出 hi ,程序运行截图如下:

复习课16 C语言操作符_复习_07

易错点:我们来观察以下代码并判断其输出的内容:

#include<stdio.h>
int main(void){
	int age = 10;
	if (age = 5){
		printf("hi");
	}
	getchar();
	return 0;
}

我们可能会认为程序什么都不会输出,因为 age 的值为 10 ,10 ≠ 5,但是当我们运行程序后会发现程序依然输出了 hi ,如图所示:

复习课16 C语言操作符_复习_08

这是为什么呢?其实这里的等于号的作用根本不是判断,而是将 5 赋值给 age ,当if语句去判断时 age的值已经变成了 5 所以满足条件输出 hi 

解决方法:如果需要进行判断,我们需要用到 == (两个等于号)而不是一个等于号,当我们将if()语句中的条件语句改为 age == 5 时,再次运行程序我们就可以发现程序什么都没有输出,如图所示:

复习课16 C语言操作符_复习_09


7.逻辑操作符

&&       //逻辑与

||          //逻辑或

我们依然使用代码来理解这两个逻辑操作符,代码如下:

#include<stdio.h>
int main(void){
	int a = 10;
	int b = 20;
	if (a && b){
		printf("hello");
	}
	getchar();
	return 0;
}

我们编译并运行上述代码后程序会输出 hello ,这是因为 a 与 b 的值均为非零值,在C语言中我们称非零的值为真,等于0的值为假,当if语句中条件语句为假的时候则不会执行if语句中的内容,若为真则会执行if语句中的内容,&& 表示这里两个值必须同时满足非零这个条件,当我们将 a 或 b 任意一个值改为 0 时再运行程序则会发现程序什么也没有输出,如图所示:

复习课16 C语言操作符_操作符_10

那如果我们只需要任意一个变量值为非零就执行if语句中的内容就需要用到 || 逻辑或,代码如下:

#include<stdio.h>
int main(void){
	int a = 0;
	int b = 20;
	if (a || b){
		printf("hello");
	}
	getchar();
	return 0;
}

这是尽管 a 的值等于 0 但是 b 依然为非零数,所以if条件依然为真,所以会输出 hello ,如图所示:

复习课16 C语言操作符_C语言_11


8.条件操作符

exp1 ? exp2 : exp3

我们可以看到上面的条件操作符有三个操作数所以我们又称其为三目操作符,以下是三目操作符的规律:

exp1 ? exp2 : exp3

 真      结果    舍弃

 假      舍弃    结果

如以下代码:

#include<stdio.h>
int main(void){
	int a = 0;
	int b = 20;
	int c = (a>b ? a:b);
	printf("c=%d\n",c);
	getchar();
	return 0;
}

a > b 在这个程序中为假,所以最终的结果为 b ,程序运行截图如下:

复习课16 C语言操作符_C语言_12


9.逗号表达式

exp1 , exp2 , exp3 , ...... ,expN

逗号表达式就是将表达式用逗号隔开,逗号表达式的特点是从左往右依次进行运算,整个表达式结果是最后一个表达式的结果,如以下代码:

#include<stdio.h>
int main(void){
	int a = 0;
	int b = 20;
	int c = 30;
	int result = (a= a+b,b = b+c,c = c+b);
	printf("result=%d\n",result);
	getchar();
	return 0;
}

这里我们使用逗号表达式,首先将 a+b 的值重新赋值给 a ,将 b+c 的值重新赋值给 b,最后再将 c+b 的值赋值给 c ,结果分别是 a = 20 、b = 50 c = 80 ,上文说过逗号运算符最终结果是最后一个表达式的结果,这里为80,如图所示:

复习课16 C语言操作符_操作符_13


10.下标引用操作符与函数调用操作符

[]   ()   

1.下标引用操作符

当我们创建一个数组时候,我们想要访问数组的元素,那么我们就需要用到下标引用操作符,示例代码如下:

#include<stdio.h>
int main(void){
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	printf("arr[5] ---> %d\n",arr[5]);
	getchar();
	return 0;
}

这里printf()函数中实参 arr[5]中的[]就是下标引用操作符,arr与3就是[]的操作数


2.函数调用操作符

无论是调用printf()函数还是我们自定义的函数都需要用到(),()就是函数调用操作符,示例代码:

#include<stdio.h>
int ADD(int x, int y){
	int z = x + y;
	return z;
}
int main(void){
	int a = 10;
	int b = 20;
	int sum = ADD(a,b);
	printf("sum=%d\n",sum);
	getchar();
	return 0;
}

这里我们在main()函数中调用的自定义函数ADD(a,b),这里的()就是函数操作符,ADD、2、3均为()的操作数

                                                                                                                     2023/11/25

                                                                                                                           王起舟