近期学习的一些问题总结(一)

154 阅读1分钟

1.倒转数

输入一个数字,对其%10可以取出其最低位,接下来除非这个数=0,否则一直对其不断除以10,然后继续%10,即可实现把数倒转的效果。下面是源码:

截屏2022-01-29 下午12.00.01.png

2.数字变字符

数字0-9的ASCII码是0-9,但是字符‘0’-‘9’的ASCII码是从48-57,所以当我们输入数字的时候,我们也是循环取位,然后对其+48,以%c字符形式输出即可。当然值得注意的是,无论是数字还是字符,0-9之间输出的效果是无法用肉眼看出来的。源码如下:

截屏2022-01-29 下午12.07.11.png

3.关于算术运算符和逻辑运算符的使用

上次在写一个条件判断时,不小心写作1<a<7。我们知道,逻辑运算符相同优先级情况下,运算顺序是从左至右的,所以我们都是先计算吗1<a,逻辑表达式返回的是真或假,在C语言中没有bool类型,因此只有返回0和返回1,所以无论a是多少,最终返回的要么是0,要么是1,这两者都是肯定小于7的,所以这个条件是始终成立的。因此我们在写这类逻辑表达式的时候,一定要与数学中的写法加以区别,所以最好的办法引入逻辑与&&和逻辑或||。

4.判断浮点数是否相等

依据IEEE754标准,浮点数的精确度大概在6-7位,而且浮点数的存储,采用的是近似存储,不妨看看实际存储吧:

截屏2022-01-29 下午12.31.25.png 显而易见,我将浮点变量f赋为123.45,然而当我输出时并不是精确存储的123.45,而是一个与123.45数值极其接近的一个浮点数。因此我们在判断浮点数是否相等时,并不能直接对其进行==等值判断,因为肯定是不相等的:

截屏2022-01-29 下午12.34.40.png 那如何判断浮点数相等?由于浮点数的存储采用的是近似存储,实际存储的值与实际值的差别微乎其微,这给我们判断提供了思路。类比高等数学中极限的概念,这个数若是和实际数的差距,要多小有多小,是不是就能判断二者“相等”呢(实际上还是不相等的,但是可以近似比拟),编码运行后果不其然:

截屏2022-01-29 下午12.49.28.png

5.关于逻辑非的一些问题

上周写到一行代码:j=!!i;下意识的认为对i取非再取非,刚好抵消,还是i的值。但是实际上不是,c语言中对一切不为0的数都看做真值,即为1.对其取非为0,再取非就是在0的基础上取非也就是1,而不是原来的i的值。

6.左值

我们都知道,在一个表达式中,在当前阶段,等号左边必须要是一个变量(当然也可以是其他)。那么如果是表达式呢? 表达式作为仍处在计算过程中,是存储在cpu寄存器内的,并没有给其确定的占用的内存的空间,因此形象概括就是等号的左边必须要是一个具有对应的内存空间的(例如变量等等)才可以,否则是错误写法。当前阶段我们只会在等号的左边写变量。

7.前自增和后自增

写两段代码:j=i++>-1;j=++i>-1; 最终j的值一样吗?很多人只是单纯理解了后++就是先用再加,前++就是先加再用,但实际上并没有理解其中的原理。我们以i取-1做说明,先看代码:

截屏2022-01-29 下午1.09.35.png 第一段:后++,即先把i的值-1赋给j后再i+1,对这个值与-1比较大小,-1并不>-1,返回0

第二段:前++,即先对i+1再赋给j,与-1比较大小,0>-1,返回1