三千字带你梳理C语言中常见的操作符知识点

发布时间:2026/10/8 18:54:00
三千字带你梳理C语言中常见的操作符知识点
目录1.操作符和运算符2.双目运算符3.单目运算符4.表达式求值5.类型转换6.问题表达式操作符和运算符操作符就是运算符两者是一样的操作符分为双目操作符和单目操作符双目操作符对应两个操作数单目操作符对应一个操作数双目操作符算术操作符-* /加减乘都比较简单编写一些代码运行一下int main() {//加法 int a 13; int b 12; int c 0; c a b; printf(ab%d\n, c); }运行结果就是25int main() {//减法 int a 13; int b 12; int c 0; c a - b; printf(a-b%d\n, c); }运行结果是1int main() {//乘法 int a 13; int b 12; int c 0; c a*b; printf(a*b%d\n, c); }运行结果是156除法这里就要好好讲一下int main() {//神奇的除法 int a 5; int b 2; float c 0.0f; c a / b; printf(a*b%f\n, c); }以上面的代码为例我希望可以得出5除以2的值因为我们知道答案肯定是一个小数我们设置了一个float类型的变量来表示得出的值但是运行出来的结果却是2.0000005除以2的值难道不是2.500000吗在除法中分为整数除法和浮点数除法整数除法就是当两个数都是整数时相除得到的数就要变成整数如果有小数就直接将小数点后的数去掉在这个代码中2和5都是整数所以相处的得到的结果就是整数原来是2.5直接将小数点后的数去掉就是2再将2赋值给c浮点数除法当两个数中至少有一个数是浮点数那么相除的得到的数就要变成浮点数如果我们希望得到的结果是2.5000002和5中至少有一个浮点数int main() {//浮点数除法 float a 5.0f; int b 2; float c 0.0f; c a / b; printf(a*b%f\n, c); }int main() {//浮点数除法2 float c 5.0 / 2; printf(a*b%f\n, c); }可以将a变成浮点数或者换一种写法都是可以的%这个符号是取模其实就是取余数int main() {//取模 int a 5; int b 2; int c 0; c a % b;//5/22....1,余1 printf(c%d\n, c); }上面这个程序就是取余一定要注意是余数浮点数可不可以取余呢编写一个程序来试一下int main() {//浮点数取余 float a 5.8; int b 2; int c 0; c a % b; printf(c%d\n, c); }我们将这个变量a从整数变成浮点数运行程序发生报错证明小数是不可以取余的%的左右两端是不可以出现小数的int main() {//浮点数取余 float a 5.8; float b 2.2; int c 0; c a % b; printf(c%d\n, c); }这个同样是运行不通过赋值运算符就是赋值运算符就是将等号右边的值赋给左边int main() {// int a 0; int b 0; int c 9; a 8; b c; printf(a%d\n, a); printf(b%d\n, b); printf(c%d\n, c); }看上面这个程序将8赋给a将c的值赋给b运行得出的结果a8b9c9将c的值赋给b本身并没有改变c的值赋值的方向只能是从右向左顺序是不能改变否则就会报错这一点就和数学上并不一样在C语言中cb不等于bc前者是将b的值赋给c后者是将c的值赋给b在数学中8a和a8是一样的但是在C语言中前者就是错误的写法下面讲一下初始化和赋值的区别在创建变量的那一刻进行的赋值就叫初始化之后的都叫赋值int main() {//赋值与初始化 int a 5;//初始化 int b 0;//初始化 a b;//赋值 b 3;//赋值 }复合赋值常见的复合赋值有-*/int main() {// int a 2; int b 9; a 1;//aa1 b 6;//bb6 printf(a%d\n, a); printf(b%d\n, b); }的意思就是某个变量自身加上某个数再次赋给这变量比如a1其实就是等于aa1同样再推理一下-就是某个变量自身减去某个数再赋值给这个变量int main() {//- int a 2; int b 9; a - 1;//aa-1 b - 6;//bb-6 printf(a%d\n, a); printf(b%d\n, b); }上面这个程序运行的结果就是1和3同样可以推理出*和/int main() {//* int a 2; int b 9; a * 2;//aa*2 b * 6;//bb*6 printf(a%d\n, a); printf(b%d\n, b); }程序运行的结果就是4和54int main() {// / int a 2; int b 9; a / 2;//aa/2,结果是1整数除法 b / 6;//bb/6结果是1整数除法 printf(a%d\n, a); printf(b%d\n, b); }上面是/运行的结果都是1都发生了整数除法单目操作符自增自减运算符自增运算符自增运算符的作用就是让变量中的值自增1其实也就是相当于a1或aa1int main(){//自增运算符 int a 2; a; printf(a%d\n,a); }int main(){//自增运算符 int a 2; a; printf(a%d\n,a); }这两个程序运行的结果都是a3让变量a的值增加了1自增运算符又分为前置符和后置但是要记住的是不管是前置还是后置最终目标都是让其自增1 这两个程序中a是前置a是后置的但是结果都是a3让变量a的值增加了1但两者又有区别区别在于表达式的值不同上面的都是当它们单独成一条语句的情况int main() {//表达式中的自增运算符 int a 2; int b 0; int c 2; int d 0; b a; d c; printf(b%d\n, b);//b3 printf(a%d\n, a);//a3 printf(d%d\n, d);//d2 printf(c%d\n, c);//c3 }看上面这个程序程序运行的结果是b3 a3 d2 c3前置自增运算符表示先自增再使用在程序中baa首先自增1变成3再将值赋给bb3后置自增运算符表示先使用再自增在程序中dcc先将自己的值赋给dd2然后再自增1c3其实综合来看不管是前置还是后置其最终的结果都是让自己自增1只不过是赋值前后的问题自减运算符自减运算符与自增运算符同理最终目标都是让自身的值减1前置和后置的不同也是在于表达式中何时自增int main() {//表达式中的自减运算符 int a 2; int b 0; int c 2; int d 0; b --a; d c--; printf(b%d\n, b);//b1 printf(a%d\n, a);//a1 printf(d%d\n, d);//d2 printf(c%d\n, c);//c1 }我们将上面的程序改一下b–aa先自减再赋值b1a1dc–c先赋值再自减所以d2c1正负正负是不同于我们在算数运算符中学到的减和加正负是单目运算符减加是双目运算符int main() {//正负 int a 2; int b -2; printf(a%d\n, a);//a2 printf(b%d\n, b);//b-2 a -a;//a-2 b -b;//b2 printf(a%d\n, a); printf(b%d\n, b); }其实正号感觉没有什么用正号就是保持之前的不要变在这个程序中负号使a和b这两个变量中的值得正负号都发生了改变a从2变成了-2其实和数学中的一样表达式求值我们学会了很多的操作符那我们就可以写一些表达式了但是表达式在求值的时候要注意求值的顺序我们可以根据优先级和结合性来进行求值当一个表达式中有很多优先级不同的操作符我们都是让优先级高的先进行计算int a2; int b5; int c3; int d0; dab*c //乘法的优先级高于加减法所以先算乘法再算加法当一个表达式中操作符都是在同一优先级就要用到结合性int a2; int b5; int c3; int d2; int e0; ea-bc*d //这个我们就先计算乘法计算完成乘法后就是相当于只剩下了加法和减法我们根据结合性从左到右进行计算类型转换类型转换也是很重要的下面我们来学习一下类型转换主要分为两大类第一类是隐式类型转换第二类就是显式类型转换隐式类型转换隐式类型转换分为两类整型提升常规算术转换为什么叫隐式类型转换隐式类型转换就是编译器自己自动进行转换为了让表达式中数据类型兼容整型提升这个是适用于数据类型低于int类型的比如charshort在计算过程中会自动将char和short类型提升成int或unsigned int类型再进行加减int main() {//整型提升 int a 0; char b 20; short c 10; a b c;//b,c提升成int类型 printf(a%d\n, a); }常规算术类型转换变量的数据类型的长度是大于等于整型的长度时如果某个操作符的的操作数属于不同的类型那么除非其中一个的操作数转换为另一个操作数的类型否则操作就无法进行1. long double 2. double 3. float 4. unsigned long int 5. long int 6. unsingned int 7. int靠后的要向靠上的进转换float a1.2f; int b3; float c0; cab;//b会先转换成float类型再与a进行计算显式类型转换显式类型转换就是强制类型转换我们可以自己用来对数据进行类型转换、我们通常就是在我们想要转换的变量前加一个括号括号里面写我们想要转换的数据类型int main(){//强制类型转换 int a 5; int b 2; float c 0; c (float)a / b;//将a变量强制转换成float类型就可以进行浮点数除法 printf(c%f\n, c);//c2.500000我们通过强制类型转换就可以不用把a变量重新定义成float类型可以在计算时直接进行强制类型转换很方便问题表达式问题表达式就是说一些表达式中没有规定子表达式的计算顺序计算顺序不确定的情况下就会影响计算结果int a2; int b3; int c4; int d5; int e0; e(a*b)(c*d)//这个表达式两个括号你不知道可以先算哪一个你既不能用优先级也不能用结合性结合性是对于同一优先级不同符号现在你既可以从左向右又可以从右向左虽然在这个例子中并不影响int a10; c(ba3)-(a5)//这个结果是未定义的你可以从左向右算 13-58也可以从右向左算 8-53int i1; int r(i)(i)(i);//这个也是未定义的不同的编译器计算的结果都不一样尽量不要写这种问题表达式操作符的知识点今天就分享到这里了多多点赞收藏我们下一篇笔记再见更新预告分支语句有关笔记