内功+1+1+1(跳坑+1+1+1)
1.算术运算符
(1)+、-:加、减,同数学计算
(2)*:乘,同数学运算但是不可省略
(3)/:除,运算结果和运算数有关,依照隐式类型转换
隐式类型转换

在隐式类型转换中有两条规则:
a.横向1为必转,即在计算过程中只要出现就一定会转换
b.纵向2为低精度到高精度转换,即低精度数据和高精度数据一起运算时发生转换
eg:


因为字符型变量的本质存储的是字符的ascii码,说到底还是数字,所以此处‘a’为4字节
因为ch1是我们定义的一个char型变量,所以为1字节
ch1+ch2为运算,所以此时会自动转化为int型,所以为4字节
你以为这就完了吗。不!咱还没跳坑呢

来猜猜结果是什么吧!

由图1可知unsigned的精度比int的精度高,所以在计算时int会自动转换为unsigned型,-10的二进制首位为1,当为无符号整型时为40多亿(注意这里不是变成10了哦),所以输出yes。
注意:1.两整数相除相当于整除效果
2.除数不能为0
(4)%:取余
注意:a.结果的符号取决于左操作数
eg:- 10 % 3 = - 1;10 % - 3 =1;
b.除数不能为0
用途:
a.判断奇偶,余数为1是奇数,余数为0是偶数
b.产生随机数 a%N 结果会在[0~N-1]
实现方法:

其中int rand(void);其功能是伪随机数产生器。void srand (unsigned int seed);其功能为产生伪随机数,seed为随机数产生需要的种子值。(在电脑中看似是产生了一组随机数,其实是将这个种子值经过一系列计算得到的一组数,所以如果种子值不变那么所产生的随机数也不变,这时就需要一个随时变化的数值来充当种子值,时间就是最好的选择)time_t time (time_t * tloc);其功能为获得一个时间的秒数值,参数表示保存秒数的一个变量地址,返回值为一个秒数。最后通过对随机数的一些运算就可以得到具有一定范围的随机数。最后对产生的随机数除50其余就可以吧随机数控制在0-50,再加50即可将输出值控制在50-100
最后还要说的就是srand 只负责初始化 / 修改全局种子,执行一次就永久生效,srand直接把传入的 seed 赋值给内部全局的 state,重置随机数序列的起点;后续每一次调用 rand(),都会自动读取这个全局种子参与计算。
(5)++,--:自增自减,以自增为例,自减与其用法一致
用法:a.i++,表示先用后加
b.++i,表示先加后用
这两种用法只有在参与其他运算时才起作用。
eg:

i++为先用后加所以先将i的值赋给ret1,再加1,此时ret1=10,i=11,;++i为先加后用,所以此时i=12,ret2=12;
注意:a.i必须为左值
b.浮点数也可以自增,整数部分加1
左值:内存中一块有固定存储位置的对象,可定位的变量,即通过&符号可以取到他的地址,为变量。
右值:临时的、没有持久内存存储的值,不可定位,为常量、表达式。
我其实不是很理解为什么常量和表达式找不到存储的位置,此处回答为ai结论仅供参考
字面常量是编译期就确定的立即数:比如代码里写10,编译器会直接把这个数值编码进指令里,不是放在数据内存的某个格子里,CPU 读取指令时直接拿到数值,没有独立的内存单元,自然没法用&取地址。字符串常量特殊补充:"hello"是字符串字面量,它会被存放在只读数据段,能做&"hello"这类取地址操作、能作为左值相关的数组左值使用,但它不能被修改,属于const属性的左值。而表达式被存放在CPU 寄存器 / 栈临时内存,用完立刻销毁。
const修饰表示限定为只读变量,所以不能被修改。

我们在使用++,--过程中要尽量避免以下几种写法

因为他们的输出结果和传参顺序以及i用完之后什么时候+1均和编译器有关,所以不同编译器可能输出不同结果,所以在书写时一定要让代码具有确定性。
2.赋值运算(自右向左结合)
在此首先要分清初始化和赋值的区别。
初始化:int a=10;在定义变量的同时给值
赋值:int a;
a=10;定义变量是不给值
注意:1.赋值运算可以连续赋值 a = (b = (c = 1));
2.不同类型的数据混合赋值
(1)高精度=>低精度(浮点型=>整型)--------会造成精度丢失
eg: float f = 1.23; int a ; a = f; 此时输出为1
(2)长整型 =>短整型 --------会造成高位截断
eg: int a = 0x12345678;short b = a; 此时输出为0x5678
(3).短整型 => 长整型
有符号短整型 => 长整型 ------符号位扩展
无符号短整型 => 长整型 ------统统补0


在此代码中0x1234的二进制编码为0001 0010 0011 0100(首位为符号位)在赋值给长整型时没有变化,而0x8234的二进制编码为1000 0010 0011 0100,此时最高位即是符号位也是数值位,在赋值时就会把它当成一个负数,所以前面四个字节就会变成ffff。
3.逗号运算(顺序求值运算符)
表达式1,表达式2,表达式3......
表达式结果为最后一个表达式的运算结果。
看似很简单实则依旧有坑,下面进行举例
t=1,t+5,t++
其结果为1,首先第一个表达式可知t=1,在第二个表达式中仅仅进行了运算,并未给t赋新值,所以t依旧为1,第二个表达式为t++是先用后加,所以结果为t=1。
4.贪心原则
从左到右逐个字符扫描,尽可能多的结合成c语言的运算符。
eg:i+++i
i ++ + i
从左至右依次扫描,首先是i为变量,接下来为+,是运算符,继续扫描++,是运算符,继续扫描+++,不是运算符,所以只能将++接合,最后便可计算出答案

作者被这道题坑到了,所以请大家也来看看,明天揭晓答案!
&spm=1001.2101.3001.5002&articleId=162970963&d=1&t=3&u=10c7d5d140d84cf48de718d239859e65)
1077

被折叠的 条评论
为什么被折叠?



