文章目录C语言梦开始的地方3算术操作符位操作符赋值操作符单目操作符强制类型转换C语言梦开始的地方3上一章节C语言梦开始的地方2 我们了解C语言用于存储生活中的各种数据的类型整数类型字符类型浮点数类型等这些。本章节我们了一下C语言提供各种的操作符是如何使用。算术操作符在我们日常写代码的时候一定是会涉及计算的C语言为了方便运算提供了一系列的操作符其中有一组操作符叫算术操作符。分别是 - * / %这些操作符都是双目操作符。双目操作符的意思就是要有两个操作数比如c a b; 那么当前的操作数就是a和b这两个变量。加、减、乘、除、取余。整数除会截断% 只能用于整数。intmain(){inta3,b2;printf(加法操作%d\n,ab);printf(减法操作%d\n,a-b);printf(乘法操作%d\n,a*b);printf(除法操作%d\n,a/b);printf(取余操作%d\n,a%b);return0;}这里我们需注意的是%的两个操作数一定要是整数如果是非整数就会报错。不要用unsigned进行小-大这种操作除了是你代码需要这样因为unsigned小-大出现的数并不是负数小-大是一个很大的数比如2 - 3在unsigned的结果是4294967295d。但是有的人进行这个操作时得出的结果和signed的2 - 3是一样的是因为你使用的printf格式符是signed而不是unsigned的signed是%d%ld这种unsigned是%u这样printf输出的才是正确计算的值。C99 起整数除法是向零取整截断。正数时两者相同3/21但负数不同C 中 -3/2 是 -1向下取整则是 -2。建议改成截断小数部分/向零取整。顺带可补充% 取余结果的符号与被除数相同-3 % 2 -1。位操作符我们知道计算机存储的是二进制即0和1而位操作符就是C语言提供给我们来进行二进制运算的。分别是 | ^ ~intmain(){inta2,b3;// 2 010, 3 011printf(a b %d\n,ab);// 010 011 010 2printf(a | b %d\n,a|b);// 010 | 011 011 3printf(a ^ b %d\n,a^b);// 010 ^ 011 001 1// 对 a 按位取反注意 ~ 是单目操作符取反就是0取11取0printf(~a %d\n,~a);printf(a 1 %d\n,a1);// 010 左移1位 100 4printf(a 1 %d\n,a1);// 010 右移1位 001 1return0;}注意 ~2 在 %d 下输出 -3int 按补码对含符号位取反。但是这是signed而unsigned取反是0转11转0的操作。计算机的计算是通过原码反码和补码进行的后面我们会深入了解现在我们只需要了解signed的原码左边第一个是符号位正数的原码反码和补码是一样的负数的原码取反是反码反码 1是补码赋值操作符C语言提供的赋值操作符有和复合赋值比如-这种注意在变量创建的时候给一个初始值叫初始化在变量创建好后再给一个值这叫赋值。intmain(){//初始化在变量创建的同时赋初值inta10;//赋值先创建变量之后再给它赋值intb;b10;// 复合赋值 与 普通赋值 的对比 a10;// 重置b2;ab;// 等价于 a a b;printf(a b %d\n,a);a10;a-b;// 等价于 a a - b;printf(a - b %d\n,a);a10;a*b;// 等价于 a a * b;printf(a * b %d\n,a);a10;a/b;// 等价于 a a / b;printf(a / b %d\n,a);a10;a%b;// 等价于 a a % b;printf(a %% b %d\n,a);a1;ab;// 等价于 a a b; 即 12 4printf(a b %d\n,a);a16;ab;// 等价于 a a b; 即 162 4printf(a b %d\n,a);a5;ab;// 等价于 a a b; 即 101 010 0printf(a b %d\n,a);a5;a|b;// 等价于 a a | b; 即 101 | 010 111 7printf(a | b %d\n,a);a5;a^b;// 等价于 a a ^ b; 即 101 ^ 010 111 7printf(a ^ b %d\n,a);return0;}单目操作符前面介绍的操作符都是双目操作符(除了~)有2个操作数的。C语言中还有一些操作符只有一个操作数被称为单目操作符。、–、(正)、-(负) 就是单目操作符的。和 -在C语言中是符号位的意思比如10 等价于 10-10 就是负数10 和 – 也分前置和后置我们通过代码来进行了解intmain(){// 前置 和 后置的区别inti3;printf(i %d, 之后 i %d\n,i,i);// i 先用后加3intj3;printf(j %d, 之后 j %d\n,j,j);// j 先加后用4// 谭浩强 《C语言程序设计》中对的错误使用i5,j5;intp,q;p(i)(i)(i);q(j)(j)(j);printf(%d, %d, %d, %d\n,p,q,i,j);// 书里写的结果是 15, 22, 8, 8// C语言对应的标准用法i5;j5;i;i;i;// 等价于原例中的 (i)(i)(i)pi;// p 8j;j;j;// 先自增qj;// q 8printf(%d, %d, %d, %d\n,p,q,i,j);// 任何编译器都输出 8, 8, 8, 8return0;}虽然谭浩强老师写的代码在如今的编译器中存在二义性但是谭浩强老师在《C语言程序设计》中的思路与套路依旧能打主要还是谭浩强老师在写这本书时年纪已经很大了。而且这本书在如今的ai时代是一本完全可以作为入门级的C语言书籍来看的。强制类型转换在操作符中还有一种特殊的操作符是强制类型转换。强制类型转换我们通过下面代码进行了解强制类型转换的用法(类型)变量intmain(){inta3,b2;// 不转3/2 得 1强制把 a 转 float 再除结果 1.5printf(%f\n,(float)a/b);doubled3.99;inte(int)d;// 截断小数部分e 3不是四舍五入printf(%d\n,e);intf65;charg(char)f;// 65 是 A 的 ASCII 码printf(%c\n,g);// 强制转换只产生临时值原变量 a 的类型和值不变printf(%d\n,a);// 仍是 3return0;}隐式转换int float 时 int 自动提升为 float。这里提升是因为float能表达的范围更精确显式转换语法 (类型)表达式如 (float)a。注意(int)3.99 是截断不是四舍五入double→int 大数会溢出(float)a / b 等价 ((float)a) / b括号位置要看清楚。俗话说强扭的瓜不甜我们使用强制类型转换都是万不得已的时候使用如果不需要强制类型转化就能实现代码这样自然更好的。本章我们把 C 语言最基础的算账工具都过了一遍——算术、位运算、赋值、单目、强制类型转换。其实操作符不难难的是细节整数除法会截断、% 只能用在整数上、unsigned 不能随便小减大、~ 和补码的关系、强制转换要小心截断和丢失。但是本章节仍有一些操作符没有介绍到下一章节我们就配套这选择和循环语句进行讲解。完