C语言基本语法-操作符

发布时间:2024年01月20日

介绍

这一篇文章总结一些C语言中常用到的操作符,包括关系操作符、条件操作符、逻辑操作符、算数操作符、赋值操作符以及单目操作符。

1? 关系操作符

在生活当中我们常常需要比较两者之间的关系,C语言中用关系表达式来进行这种操作。关系表达式是用于比较的表达式,关系表达式中所含有的操作符叫做关系操作符。

常用的关系操作符有以下6种:

>:大于操作符?

<:小于操作符?

>=:大于等于操作符?

<=:小于等于操作符?

==:等于操作符?

!=:不等于操作符

对应的六种关系表达式为:?

a > b

a < b

a >= b

a <= b

a == b

a != b?

关系表达式运算的结果只有0和1(关系表达式成立(即为真)表达式的值为1,关系表达式不成立(即为假)表达式的值为0)。在C语言中0表示假,非零的任意常数表示真。表达式5>3结果为1,5<3的结果为0。

注意:

1、不等将=与==混淆

=表示的是算术操作符表示赋值的意思,而==表示的是关系操作符返回的结果只有0和1,如果在if或while语句中将==误写成=,那么if语句的判断结果恒为真。如:

if(a=6)  //此表达式的结果恒为真语句将一直执行
    printf("6 ");

为了避免这种失误的出现可以这样写:

if(6=a) //编译器报错 
    printf("6 ");

这样数值在等号的左边可以在少写等号的时候编译器会报错,而上面的数值在等号的右边编译器是不会报错的。?

2、多个关系操作符尽量不连用避免造成误解

在数学中我们常用i<j<k,但是这种关系表达式会造成歧义,它在执行时会这样进行(i<j)<k,括号中i<j的值不为0就为1所以最后变成了0或1与k的比较,达不到我们的目的。这种表达式可以这样写来避免这种尴尬:

if(i < j && j < k)
    ......

关系表达式常常用于while与if语句中在他们中充当条件表达式,判断循环或者是分支是否执行。

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

若输入的a的值大于等于输入的b的值为真即结果为1则打印。

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

这将会是一个死循环:

2? 逻辑操作符

逻辑操作符主要包括三个分别是!、&&、||,他们分别时逻辑非,逻辑与,逻辑或。

2.1? !

?逻辑非!:如果a的值为0(假),那么!a的值为非0(真);如果a的值为非0(真),那么!a的值为0(假)。

#include<stdio.h>
int main() {
	int num = 0;
	if (!num) {
		printf("%d ", num);
	}
	return 0;
}

打印结果:

num的值为0,加上!之后if条件表达式值变为非0,开始执行if语句中的程序。?

2.2? &&?

逻辑与:&&表示并且的意思是一个双目操作符,a&&b即为a并且b的意思,如果a、b的结果都为真则a&&b的结果才为真,a、b中有任何一个为假则a&&b的结果即为假。

a!0!000
b!00!00
a&&b!0000

?口诀:全真则真,一假全假

例如第一季度是一到三月怎么根据输入的月份来判断是否为第一季度呢?

#include<stdio.h>
int main() {
	int month;
	scanf("%d",&month);
	if (month <= 3 && month >= 1)
		printf("%d月是第一季度\n",  month);
	return 0;
}

运行结果:

2.3? ||?

逻辑或:||?表示或者的意思是一个双目操作符,a||b即为a或者b的意思,如果a、b的结果都为假则a||b的结果才为假,a、b中有任何一个为真则a||b的结果为真。

a!0!000
b!00!00
a||b!0!0!00

口诀:全假则假,一真全真

例如假设每年的12月、1月、2月为冬季,如何判断输入的月份是否为冬季呢?

#include<stdio.h>
int main() {
	int month;
	scanf("%d", &month);
	if (month == 12 || month == 1 || month == 2)  
		printf("%d月是冬季\n", month);
	return 0;
}

运行结果:

2.4? 逻辑运算中的“短路”现象

逻辑运算中“短路”现象是指仅计算逻辑表达式中的一部分便能确定结果,而不对整个表达式进行计算的现象。在C语言中表达式的运算顺序是先对左边表达式求值再对右边进行运算,所以如果仅仅计算左边就能得到整个表达式的结果那么就不再对右边的表达式进行求值了。

举个栗子:表达式: ( a == 0 &&?b ==1) ,只要a == 0为真时,整个表达式的结果就肯定是假(整个表达式的值为0),故不会再对b==1进行判断,所以对于&&如果左边的表达式为假就不会再继续进行对右边表达式的判断了。表达式: ( a == 1 ||?b ==0) ,只要a == 1为真时,整个表达式的结果就肯定是真(整个表达式的值为1),故不会再对b==0进行判断,所以对于||如果左边的表达式为真就不会再继续进行对右边表达式的判断了。但是有些时候这种现象会带来意想不到的结果如:

用一下智慧猜想以下两段代码的运行结果吧 *=*

#include<stdio.h>
int main() {
	int a = 10;
	int result = (10 < 9) && (a++ > 5);
	printf("a=%d  result=%d", a, result);
	return 0;
}

?运行结果:

?

#include<stdio.h>
int main() {
	int a = 10;
	int result = (10 < 9) || (a++ > 5);
	printf("a=%d  result=%d", a, result);
	return 0;
}

运行结果:

??

?说明:第一段代码中10<9判断结果为假,在&&运算中一假全假则不会再去执行a++>5的操作所以a的值还是为10。但第二段代码10<9为假所以会继续向右执行a++>5的程序,所以a的值变为11,并且在||运算中一真全真result的结果为1。

?例1:输入一个年份判断是否为闰年

tips:闰年的条件? 1.能被4整除且不能被100整除的是闰年? 2.能被400整除的是闰年? 满足其中一个条件即为闰年。

#include<stdio.h>
//方法1
int main() {
	int year = 0;
	scanf("%d", &year);
	if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
		printf("%d年是闰年\n", year);
	else
		printf("%d年是平年\n", year);
	return 0;
}

//方法2
int main() {
	int year = 0;
	scanf("%d", &year);
	if (year % 4 == 0 && year % 100 != 0)  
		printf("%d年是闰年\n", year);
	else if(year % 400 == 0)
		printf("%d年是润年\n", year);
	else
		printf("%d年是平年\n", year);
	return 0;
}

?

3? 条件操作符

条件运算符又称三目运算符是C语言中唯一的一个三目运算符。

求两个数中较大的一个我们肯定可用if语句去编写:

#include<stdio.h>
int main() {
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	if (a > b)
		printf("max  =  %d", a);
	else
		printf("max  =  %d", b);
	return 0;
}

但C语言中提供了一种简单方法即条件操作符,它的语法格式如下:

表达式1 ? 表达式2 : 表达式3

如果表达式1的值为真,则以表达式2 的值作为整个条件表达式的值,如果表达式1的值为真,则以表达式3的值作为整个条件表达式的值。知道这个之后上面的代码可以改为:

#include<stdio.h>
int main() {
    int a;
    int b;
    scanf("%d %d", &a, &b);
    int max = a > b ? a : b;
    printf("max = %d", max);
    return 0;
}

?4? 算术操作符

C语言中提供的算术操作符包括五种分别是+、-、*、/、%他们都属于双目操作符。加号、减号与数学中的一样,乘号、除号不同;C语言还多了一个求余数的运算符,就是 %。

4.1? +、-、*运算符

+、-的一些运算如下面代码所展示:

#include<stdio.h>
int main() {
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int result1 = a + b;
	int result2 = a - b;
	printf("a+b=%d a-b=%d", result1, result2);
	return 0;
}

也可以让数字直接参与运算:

#include<stdio.h>
int main() {
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int result1 = 5 + b;
	int result2 = a - 6;
	printf("a+b=%d a-b=%d", result1, result2);
	return 0;
}

*的相关代码实现:

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

?4.2? /运算符

两个整数进行/运算符操作得到的结果只能是整数,除不尽时遵循向下取整的规则得到整数。

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

运行结果:

?

即使不用int型申明变量以及不用int型格式化打印,结果仍然是1.000000而不是1.5。?原因就是除不尽时遵循向下取整的规则得到整数舍弃小数部分。

但是如果想得到浮点数1.5的结果? /两端的操作数必须至少有一个是浮点类型。

#include<stdio.h>
int main() {
	int x;
	float y;
	x = 3 / 2;
	y = 3.0 / 2;
	printf("x=%d  ", x);
	printf("y=%f  ", y);
	return 0;
}

?

下面有关于除法的两个问题还请各位客官耐心看完:?

第一个问题:就是数据类型不一致时会发生截断问题?。例如:

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

由于数据类型和数据不匹配所以会直接截断小数部分而不会进行什么四舍五入。

第二个问题就是用printf打印时格式化的类型和声明变量时的类型不一致结果会直接显示为0。例如:

#include<stdio.h>
int main() {
	int x = 3 / 2;
	printf("%f\n", x);
}

4.3? %运算符

%称为取余操作,也就是求两个数的余数。C语言中的取余运算只能针对整数,% 的两边都必须是整数,不能出现浮点数。另外,余数可以是正数也可以是负数,由 % 左边的整数决定,如果%左边的数是正数取余后的结果是正数,如果%左边的数是负数取余后的结果是负数。

#include<stdio.h>
int main() {
	int x = 3 % 2;
	int y = -3 % 2;
	int z = 3 % (-2);
	printf("%d ", x);
	printf("%d ", y);
	printf("%d ", z);
	return 0;
}

5? 赋值操作符

赋值操作符是一个=,声明变量是的等号的作用是初始化的意思,初始化之后在进行=操作就变成了赋值的操作。

int a = 1;    //变量初始化
a = 10;       //变量的赋值

在C语言中还可以对变量进行连续赋值即从右向左依次对变量进行赋值,但是对我们读代码是造成困难所以一般不会去连续赋值。

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

a、b、c的值依次为7,7,6。但一般将a = b = c + 1写成 b = c + 1;a = b。

还有一种是复合赋值,常见的复合赋值的相关操作如下表所示:

a+=ba=a+b
a-=ba=a-b
a*=ba=a*b
a/=ba=a/b
a%=ba=a%b

?表中第二列的操作可以写成第一列的相应形式。

6? 单目操作符

单目操作符包括前置++,后置++,前置--,后置--,+,-。

前置++:先加1再引用。

int main() {
	int a = 0;
	int b = ++a;  //先加1:a的值由0变为1。再引用:a的值为1,将1赋值给b。
	printf("a=%d b=%d", a, b);  //a=1 b=1
	return 0;
}

后置++:先引用再加1。

int main() {
	int a = 0;
	int b = a++;  //先引用:a的值为0,将0赋值给b。后加1:a的值由0变为1。
	printf("a=%d b=%d", a, b);  //a=1 b=0
	return 0;
}

前置--,后置--与前置++,后置++相对应 。

前置--:先减1再引用。

int main() {
	int a = 1;
	int b = --a;  //先减1:a的值由1变为0。再引用:a的值为0,将0赋值给b。
	printf("a=%d b=%d", a, b);  //a=0 b=0
	return 0;
}

?后置--:先引用再减1。

int main() {
	int a = 1;
	int b = a--;  //先引用:a的值为1,将1赋值给b。后减1:a的值由1变为0。
	printf("a=%d b=%d", a, b);  //a=0 b=1
	return 0;
}

+、-也是一种单目操作符:+对改变一个数的正负没有影响,-可以将负数变为正数,也可将整数变为负数。

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

?运行结果:

?总结

到此,C语言中的六种常用到的操作符已经总结完了,这是根据我听完课后得到的一些经验以及参考了许多书籍后对这六种操作符的细节之处也记录了下来。若有不恰当之处还请大家多多指点,希望对大家能有所帮助,谢谢阅读*=*

文章来源:https://blog.csdn.net/m0_74068144/article/details/135634171
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。