目录
前言
运算符是大多数编程语言中用于处理数据的基本元素之一。程序员可以使用运算符对数据进行操作,以满足特定的需求和实现特定的功能。不同的编程语言可能具有不同的运算符语法和规则,这一节我们主要来学习C语言的运算符如何运用在表达式中。
一、运算符
各种运算符我们也可以根据用途分类,大致类别如下:
接下来,我们介绍其中的一部分,其他的在我们后续章节中陆续讲到。
1.1 赋值运算符
基本使用:
赋值符号“=”就是赋值运算符,而不是表示”相等”的意思
通用的形式:
变量名=表达式;
注意:左边是一个变量,右边是要赋给该变量的值。
int Num =100:
//对于赋值运算符来说,左边的需要是变量,右边的是值
//100= Num;//这么写是错误的,因为 100 不是变量
int Num2 =0;
Num2= Num+2;//右边可以是一个算式
特殊用法,可以连续赋值:
int a,b,c;
c= 10;
a=b=c;
//先将 c 的值赋值给 b,再将 的值赋值给 a
赋值运算符有如下
"+="运算:
a+=10;相当于 a=a+10;
-="运算:
a-=10;相当于 a=a-10;
那么下面这种代码的情况:
inta=100;
int b=20;
a /= b + 10;
会是下面哪种情况呢?
1.a=a/b+10;
2.a=a/(b+10);
答案是会是第二种情况,会先把 b+10 计算出来,再赋值给 a。
类似的*= /= %=等也都是这样的用法。
1.2 算术运算符
算术运算符有如下
前七个叫一元运算符,后面四个是二元运算符。
先说二元运算符,其中都是我们常见的一些操作符号,这里需要注意一下的就是除号和取余符号。
1) 运算符"/":
-13/2 得到结果是-6
15/3.0 得到结果是5.0
10/-4.0 得到结果是-2.5
规则:
1.整数相除,结果只能得到整数部分。
2.要想得到小数部分,运算需要浮点数的参与,例如上面第三个例子
3.运算结果的符号与除数与被除数都有关系
2) 运算符"%":
-13%2 得到结果是-1
13%-2 得到结果是1
规则:
1.取模运算符的两个操作数必须是整数,不能是浮点数
2.运算结果的符号仅与被除数有关
3) 再说说自增 (++)与自减 (--)运算符:
当自增的同时还参与运算的时候,++放在后面,会先参与运算,再自增。
当自增的同时还参与运算的时候,++放在前面,会先自增,再参与运算。
自减运算符有同样的性质
int main(){
int Num=10;
int Num2 =0;
Num2 = Numt+;//先赋值,再自增
printf("%d\n",Num2);
Num2= ++Num;//先自增,再赋值
printf("%d\n",Num2) ;
//printf("%d",10++);//常量是不能自增的
return 0;
}
上述代码运行打印的结果是:10,12
1.3 逗号运算符
逗号运算符一般没有很大作用,通常就是起到了一个分隔的作用。对于它有两个常考点就是:
1优先级最低
2逗号表达式的值是最右边的值
请看下面的示例:
int nNum =0; //nNum被初始化为0
nNum =12,13,14,15; //nNum 是12
nNum = (12,13,14,15); //nNum 是15
1.4 sizeof运算符
sizeof 运算符是一个特别重要的运算符,它能够得到某一个数据或者数据类型所占用的内存大小(以字节为单位)。因为能够得到某一个数据或者数据类型的大小,所以 sizeof 中可以写数据类型,也可以写变量名。
#include <stdio.h>
int main(){
int nNum = 0;char cCha =0;
double fNom = 0;
printf("int 型占用的大小为: %d\n", sizeof(int));
printf("int 型占用的大小为: %d\n", sizeof(nNum));
printf("char 型占用的大小为: %d\n", sizeof(char));
printf("char 型占用的大小为: %d\n", sizeof(cCha));
printf("double 型占用的大小为: %d\n", sizeof(double));
printf("double 型占用的大小为:%d\n", sizeof(fNum));
return 0;
}
上述代码打印结果如下
int 型占用的大小为: 4
int 型占用的大小为: 4
char 型占用的大小为: 1
char 型占用的大小为: 1
double 型占用的大小为: 8
double 型占用的大小为: 8
1.5 其他运算符
1)比较运算符
C 语言的比较运算中, “真”用数字“1”来表示, “假”用数字“0”来表示。
2)逻辑运算符
3)位运算符
&:按位与运算符,其功能是参与运算的两数各对应的二进位相与,只有对应的两个二进位均为1时,结果位才为1,否则为0。
|:按位或运算符,其功能是参与运算的两数各对应的二进位相或,只要对应的两个二进位有一个为1时,结果位就为1。
^:按位异或运算符,其功能是参与运算的两数各对应的二进位相异或,当两数的二进位有一个相同,则结果为1。
~:取反运算符,其功能是对运算数的每一位取反,即0变1,1变0。
<<:左移运算符,其功能是把运算数的各二进制位全部左移若干位(左移一位相当于乘以2的若干次方),右边空出的位用0补充。
>>:右移运算符,其功能是把运算数的各二进制位全部右移若干位(右移一位相当于除以2的若干次方),左边空出的位用0补充。
二、表达式
在C语言中,运算符和表达式是两个不同的概念,它们之间有一些区别。
运算符是用于操作变量或值的符号,例如加号(+)、减号(-)、乘号(*)、除号(/)等。运算符的作用是根据其优先级和结合性对操作数进行运算,并产生运算结果。
表达式则是由操作数和运算符组成的语法结构,它表示一个计算过程。表达式中的操作数可以是常量、变量、函数调用等,而运算符则指定了如何对这些操作数进行计算。
例如,在C语言中,表达式 a + b 是一个加法运算,其中 a 和 b 是操作数,加号 (+) 是运算符。这个表达式表示将 a 和 b 相加,并将结果赋值给一个变量或进行其他操作。
因此,运算符是用于执行计算的操作符,而表达式则是包含操作数和运算符的计算过程。
无论是简单的式子,还是复杂的式子,表达式最终都是有一个值的,以下是常见的简单表达式,他们组成复杂运算的基础。
常量表达式 250 //单个常量,也是表达式
赋值表达式 a=5 //等号左侧必须是一个可修改的值
算术表达式 a+6 //先运算a+10再将结果赋值给a
关系表达式 a>b //a的值大于b的值
逻辑表达式 c = a&&b //c的结果只可能是1或0
函数表达式 d = fun() //将函数的返回值赋值给 d
假如一个式子中含有多个运算符,那么可以称之为复合表达式,例如
(a*60+20)/10>8,a<60&&a>10
三、语句
语句是 c 语言程序的基本组成,语句的结尾用一个分号标识,一个表达式加上一个";"就是一个语句,表达式也有可能是语句的一部分。多个语句使用{}括起来就称为复合语句(程序块),例如下面代码。
#include <stdio.h>
int main() {
int a;
int b;
scanf_s("%d",&a);
if(a>0) {
b=a%10;
printf("你输入了一个大于 0的数,它的个位是%d",b);
}
return 0;
}
在这个例子中,if 后面的两条语句称为复合语句,当然 main 函数下面在大括号之间的也是复合语句。
四、运算符的优先级和结合性
C语言中,运算符的优先级决定了表达式中哪个运算符先进行计算。优先级高的运算符会先于优先级低的运算符进行计算。例如,乘法和除法的优先级高于加法和减法,因此在表达式中,乘法和除法会先于加法和减法进行计算。
对于优先级相同的运算符,结合性规则决定了它们的计算顺序。C语言中的结合性规则是:
同一优先级从左到右依次结合;
不同优先级从高到低依次结合。
这意味着,在表达式中,如果优先级相同的运算符出现在同一操作数上,那么左边的运算符会先于右边的运算符进行计算。如果两个运算符的优先级相同但左边运算符的优先级高于右边运算符的优先级,那么左边的运算符也会先于右边的运算符进行计算。
例如,在表达式 a + b * c 中,乘法运算符 * 和加法运算符 + 的优先级相同,但是乘法运算符在左边,因此会先进行计算。计算结果会与 a 进行加法运算。
再比如例子:-8*4%2-3 = ?
运算步骤如下:
1) (一元负号优先级最高) -8
2) *与%优先级相同,因为是左结合的,所以先算* -8*4=-24
3) -24%2=0
4) 0-3= -3
总之,在C语言的表达式中,先根据优先级确定哪个运算符先进行计算,然后根据结合性规则确定同一优先级运算符的计算顺序。
但是其实,一般我们是不会去记忆优先级这些东西的,当我们拿捏不准的时候,直接使用括号即可,当使用括号时:
(1)先计算括号内的内容。
(2)在括号嵌套((())) 的情况下,最里层的最先执行
(3)包含多个括号的表达式从左向右进行计算
注意一个常见的面试考点:括号的优先级最高,逗号的优先级最低
有关运算符优先级可以整理如下图所示