4、指针变量和 0 比较
通过我们之前对C语言的学习,我们知道有三种可以表示0的方法:(bool为c99标准暂时不考虑)。
如上可知他们的类型是不相同的!就比如我们初始化时操作符两边值的类型要保持一致的!
如果类型不一样的话不同的编译器可能会报警,这个小伙伴们可以自己去测试,但至于变量建议保持一致,是否应该初始化我在上期讲过了,可以去看一看!
//例: int main() { int a = 0; double b = 0.0; int* p = NULL; return 0; }
看到这,我们来解决上面那个警告的问题,我们说他们的类型不同,究竟是为什么呢?
我们双击NULL转到定义可以看到,NULL是一个void*类型,那么我们知道用 printf 以 %d 打印时是以整型打印的,所以这里我们就要用到强制类型转换了,NULL不是void*类型吗,那我们就把他强制转换成int型,我们接着看:
可以看到,强制类型转换之后编译器正常了,连警告都没有,代码直接跑起来,那么如何理解强制类型转换呢?
这里有个小故事:
假设我们都坐在教室里上课,老师对我们说,等会要来一位同学要转到我们班来,那同学特别坏,天天欺负同学,过了一会那个同学走进教室,同学们因为听了老师的话所以一对他印象很不好,过了一会老师又对同学们说,老师说错了,这位同学特别乐于助人,成绩也很好是个好学生,同学们对他的印象又发生改变了,这就可以理解成强制类型转换。
那么简单来说,0还是那个0,我们只是用不同的类型去解释这个0,强制类型转换数据本身还是他自己,并不会改变内存中的数值,我们只是用我们想要的类型去解释他而已!
5、else 匹配问题以及 if 的其他常见问题
首先我们来看一段很简单的代码:
int main() { int val = 1; if (1 == val) { printf("hello world\n"); } return 0; }
当然我不是问小伙伴们这段代码打印啥,而是问这段代码的执行过程是怎样的?
- 先执行()中的表达式 or 函数,得到真假结果(true,false)逻辑结果
- 接着对结果进行条件判定功能
- 然后再执行下面进行分支功能
看到这呢,我想问问小伙伴有没有被不好的代码风格给影响到?这里有一段代码我们一起来看看:
int main() { int x = 0; int y = 1; if (10 == x) if (11 == y) printf("hello world\n"); else printf("hello basketball\n"); return 0; }
看完这段代码可能有小伙伴会说打印 "hello basketball", 也有的小伙伴会说什么也不打印!其实这串代码最终是什么都不打印!!!为什么呢,因为 else 匹配采用就近原则,如果我们换一下代码风格,我们再来看看:
int main() { int x = 0; int y = 1; if (10 == x) { if (11 == y) printf("hello world\n"); else printf("hello basketball\n"); } return 0; }
这样是不是就是清晰很多了?所以通过上面我们要知道 else 的匹配规则,以及我们也要养成良好的代码风格!
下面有一个很好的代码风格爱打篮球的程序猿想给各位小伙伴推荐一下:
上面的代码编译器并不会报错,仍然可以运行,但是我们想要的是如果 a == 2 我们才执行下面的打印,其实在日常写代码中,如果我们手误把 == 写成了 = 编译器是不会告诉我们的,在编程中,越早发现问题越好,那么像上面的手误操作我们应该如何避免呢?
我们可以把常量写在左边,因为赋值表达式的左值是必须可修改的,如果我们把常量放到左边了,把 == 写成了 = 编译器会直接报错:
这样写的话,我们就能直接发现代码中的错误了,会使我们更早的发现错误,所以我建议小伙伴如何写这种类似的代码呢:
int main() { int a = 0; if (2 == a) { printf("hello world\n"); } else { printf("NO!\n"); } return 0; }
这样写代码就会万无一失啦!
好了本期要讲解的几个关键字就到这里了,想必看完的小伙伴都有收获吧!接下来还会接着带你们更深度的解剖我们的C语言哦!