C语言:操作符详解(二)

发布于:2025-08-19 ⋅ 阅读:(14) ⋅ 点赞:(0)

鸡汤:
​​程序员是数字世界的建造者,拥有改变未来的力量。
尊重每一行代码,视程序为伙伴而非工具。

1. 算数操作符:+、-、*、/、%

在写代码时候,⼀定会涉及到计算。
C语⾔中为了方便运算,提供了⼀系列操作符,其中有⼀组操作符叫:算术操作符。分别是: +、 -、 * 、/ 、% ,这些操作符都是双目操作符
注意:操作符也被叫做:运算符,是不同的翻译,意思是⼀样的。

1.1 + 和 - 操作符

+ 和 - ⽤来完成加法和减法。
+ 和 - ⽤来完成加法和减法。
+ 和 - 都是有2个操作数的,位于操作符两端的就是它们的操作数,这种操作符也叫双目操作符。

#include <stdio.h>
int main()
{
 	int x = 4 + 22;
 	int y = 61 - 23;
 	printf("%d\n", x);
 	printf("%d\n", y);
 	return 0;
}

结果:
在这里插入图片描述

1.2 * 操作符

运算符 * 用来完成乘法。

#include <stdio.h>
int main()
{
 	int num = 5;
 	printf("%d\n", num * num); // 输出 25
 	return 0;
}

结果:
在这里插入图片描述

1.3 / 操作符

运算符 / 用来完成除法。
除号的两端如果是整数,执行的是整数除法,得到的结果也是整数。

#include <stdio.h>
int main()
{
 	float x = 6 / 4;
 	int y = 6 / 4;
 	printf("%f\n", x); // 输出 1.000000
 	printf("%d\n", y); // 输出 1
 	return 0;
}

结果:
在这里插入图片描述
上述代码中虽然使用 float 类型的 x 来接收返回值,但是C语言中整数的除法是整除,丢弃小数部分,返回整数部分,所以 x 接收的是整除过后的返回值。
如果希望得到浮点数的结果,两个运算数必须至少有一个浮点数,这时 C 语言就会进行浮点数除法。

#include <stdio.h>
int main()
{
 	float x = 6.0 / 4;
 	int y = 6 / 4;
 	printf("%f\n", x); // 输出 1.500000
 	printf("%d\n", y); // 输出 1
 	return 0;
}

结果:
在这里插入图片描述
再看⼀个例子:

#include <stdio.h>
int main()
{
 	int score = 5;
 	score = (score / 20) * 100;
 	printf("%d",score);
 	return 0;
}

结果:
在这里插入图片描述
正常情况下,我们的结果应该是 25 ,但是经过C语言的整除运算 score / 20 的结果是 0 ,所以 0 * 100 也等于 0 。
为了得到预想的结果,可以将除数 20 改成 20.0 ,让整除变成浮点数除法。

#include <stdio.h>
int main()
{
 	int score = 5;
 	score = (score / 20.0) * 100;  //返回 25.000000 但是被整型的 x 来接收
 	printf("%d",score);            //所以只保留整数位也就是 25
 	return 0;
}

结果:
在这里插入图片描述

1.4 % 操作符

运算符 % 表示求模运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能用于浮点数。

#include <stdio.h>
int main()
{
 	int x = 6 % 4; // 2
 	printf("%d",x);
 	return 0;
}

结果:
在这里插入图片描述
负数求模的规则是,结果的正负号由第一个运算数的正负号决定。

#include <stdio.h>
int main()
{
 	printf("%d\n", 11 % -5); // 1
 	printf("%d\n",-11 % -5); // -1
 	printf("%d\n",-11 % 5); // -1
 	return 0;
}

结果:
在这里插入图片描述

2. 赋值操作符:= 和复合赋值

在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。

int a = 100; //初始化
a = 200; //赋值,这⾥使用的就是赋值操作符

赋值操作符 = 是一个随时可以给变量赋值的操作符。

2.1 连续赋值

赋值操作符也可以连续赋值,如:

int a = 3 ;
int b = 5 ;
int c = 0 ;
c = b = a+3 ; //连续赋值,从右向左依次赋值的。

C语言虽然支持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样⽅便观察代码的执行细节。

int a = 3 ;
int b = 5 ;
int c = 0 ;
b = a + 3 ;
c = b ;

这样写,在调试的是,每⼀次赋值的细节都是可以很⽅便的观察的。

2.2 复合赋值符

在写代码时,我们经常可能对一个数进行自增、自减的操作,如下代码:

int a = 10;
a = a+3;
a = a-2;

C语言给我们提供了更简单的写法,如下:

int a = 10;
a += 3;
a -= 2;

C语⾔中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:

+=  //加等          -=  //减等
*=  //乘等          /=  //除等               %=  //模等
>>= //右移等        <<= //左移等
&=  //按位与等      |=  //按位或等           ^=  //按位异或等

3. 单目操作符 + 和 -

这里的+是正号,-是负号
运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符。

int a = +10; 等价于 int a = 10;

运算符 - 用来改变⼀个值的正负号,负数的前⾯加上 - 就会得到正数,正数的前⾯加上 - 会得到负数。

int a = 10;
int b = -a;
int c = -10;
printf("b=%d c=%d\n", b, c);//这⾥的b和c都是-10
int a = -10;
int b = -a;
printf("b=%d\n", b); //这⾥的b是10

4. 强制类型转换

在操作符中还有⼀种特殊的操作符是强制类型转换,语法形式很简单,形式如下:

(类型)

int a = 3.14;
a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告
如果我们将 3.14 的double 类型强制类型转换成 int 类型,编译器就不会报错。

int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分

注意:强制类型转换可能会导致数据的丢失,不到万不得已的地步,最好不要使用。

5. 关系操作符

C 语言用于比较的表达式,称为 “关系表达式”(relational expression),⾥⾯使用的运算符就称为“关系运算符”(relational operator),主要有下面6个。
● > 大于运算符
● < 小于运算符
● >= 大于等于运算符
● <= 小于等于运算符
● == 相等运算符
● != 不相等运算符

例子:

a == b;
a != b;
a < b;
a > b;
a <= b;
a >= b;

关系运算符通常返回 1 或者 0 。C语言中,1 代表真,0 代表假
关系表达式常用于 if 或 while 结构。

if (x == 3) {
 	printf("x is 3.\n");
}

注意:相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下⾯的代码,它可以运行,但很容易出现意料之外的结果。

if (x = 3) ...

这个代码就是把 3 赋值给变量 x ,相当于把变量 x 给修改了。它返回值永远是 3 ,所以表达式判断总是为真。

另⼀个需要避免的错误是:多个关系运算符不宜连用

i < j < k

上⾯示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。

(i < j) < k

i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进行比较。如果想要判断变量 j的值是否在 i 和 k 之间,应该使用下面的写法。

i < j && j < k

比如:我们输⼊一个年龄,如果年龄在18岁~36岁之间,我们输出⻘年。

#include <stdio.h>
int main()
{
 	int age = 0;
 	scanf("%d", &age);
 	if(18<=age<=36)
 	{
 		printf("青年\n");
 	}
	return 0;
}

结果:
在这里插入图片描述
我们输个 12 还是打印青年,这是因为,12 先和 18 比,12 比 18 小则为 0 ,0 在和 36 比,0 比 36 小,则表达式为真,所以打印青年。
正确的写法如下:

#include <stdio.h>
int main()
{
 	int age = 0;
 	scanf("%d", &age);
 	if(age>=18 && age<=36)
 	{
 		printf("青年\n");
 	}
 	return 0;
}

结果:
在这里插入图片描述
在这里插入图片描述
以上就是关于操作符,我们需要掌握的,剩下的只要按照字⾯意思理解使用就行,没有特别注意的。

6. 条件操作符

条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:

exp1 ? exp2 : exp3

条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果exp1 为假, exp3 计算,计算的结果是整个表达式的结果。

例子:

#include <stdio.h>
int main()
{
 	int a = 0;
 	int b = 0;
 	scanf("%d", &a);
 	b = a>5 ? 3:-3;    //大于 5 则返回 3,小于 5 则返回 -3
 	printf("%d\n", b);
	 return 0;
}

结果:
在这里插入图片描述

7. 逻辑操作符:&& 、 || 、!

逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。

● ! :逻辑取反运算符(改变单个表达式的真假)。
● && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
● || :或运算符,就是或者的意思(两侧至少有⼀个表达式为真,则为真,否则为假)。

7.1 逻辑取反运算符 !

逻辑反操作
比如,我们有⼀个变量叫 flag ,如果flag为假,要做⼀个什么事情,就可以这样写代码:

#include <stdio.h>
int main()
{
 	int flag = 0;
 	if(!flag)
 	{
 		printf("do something\n");
 	}
 	return 0;
}

结果:
在这里插入图片描述
如果 flag 为真, ! flag 就是假,如果 flag 为假, ! flag 就是真
所以上面的代码的意思就是 flag 为假,则 ! flag 就是真,执行 if 语句中的代码。

7.2 与运算符 &&

逻辑与
&& 就是与运算符,也是并且的意思, && 是⼀个双目操作符,使用的方式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。
比如:如果我们说⽉份是3⽉到5⽉,是春天,那使⽤代码怎么体现呢?

int month = 0;
scanf("%d", &month);
if(month >= 3 && month <= 5)
{
 	printf("春季\n");
}

这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足。

7.3 或运算符 ||

逻辑与
|| 就是或运算符,也就是或者的意思, || 也是⼀个双目操作符,使用的方式是 a || b , ||两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
比如:我们说一年月份是 12 月或者 1 月或者 2 月是冬天,那么我们怎么使用代码体现呢?

int month = 0;
scanf("%d", &month);
if(month == 12 || month==1 || month == 2)
{
 	printf("冬季\n");
}

这样就可以了。

7.4 短路

C语言逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为 “短路” 。
例如:

if (month >= 3 && month <= 5)

表达式中&& 的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。
所以,对于&&操作符来说,左边操作数的结果是 0 的时候,右边操作数就不再执行。

对于 || 操作符而言:

if (month == 12 || month==1 || month == 2)

如果month == 12,则不用再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。
所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。

像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。

END

操作符也就讲到这里了。
写的第十一篇文章,感谢大家的观看!


网站公告

今日签到

点亮在社区的每一天
去签到