摘要:死循环,是不安全代码的一种,易造成CPU load过高,从而会导致低优先级进程得不到调度而饿死。
基于这种危害,因此我们在写代码的时候要注意避免死循环。
阅读全文
摘要:一个过程调用包括将数据和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。
实现过程调用,编译器使用了一个基于栈的方法。栈,先进后出。机器用栈来传递过程的参数,存储返回信息,保存寄存器等等。
1. call function:将返回地址入栈,并跳转到function的起始处。
2. leave:使栈做好返回的准备。
3. ret:返回,从栈中弹出地址,并跳转到这个位置。
阅读全文
摘要:通过两个例子,对比阅读C代码和汇编代码,探究一下switch语句的本质。
switch语句的本质是条件语句,条件语句的本质是跳转。
当case分支多了的时候(一般大于四个时),编译器巧妙地通过跳转表的思想来访问代码位置。
关键词:跳转,跳转表。
阅读全文
摘要:要理解C语言的运行机制,阅读对应的汇编代码是非常有帮助的。
switch不会在每个case标签后面的语句执行完毕后自动终止。一旦执行某个case语句,程序将会一次执行后面所有的case,除非遇到break语句。
这被称之为“fall through”。
switch内部的任何语句都可以加上标签,所有的case都是可选的,任何形式的语句,包括带标签的语句都是允许的。
break语句事实上跳出的是最近的那层循环语句或switch语句。
阅读全文
摘要:C语言非常难理解的是指针,可是比指针还难理解的是什么呢?我想莫非是C语言的声明了。
本文告诉你运用优先级规则,如庖丁解牛一般来剖析C语言的声明。
阅读全文
摘要:C语言一个很重要的特点是简洁。但有时候它太简洁了,仅增加,修改或删除一个字符,原先的程序就可以截然不同。
简洁的C语言会让一个符号,在不同的上下文环境里表示不同的意思。这称之为符号“重载”。
这是C语言的简洁之美呢,还是简洁之痛呢?抛砖引玉,欢迎讨论!
阅读全文
摘要:整型提升:如果原始类型的所有值都可用int类型表示,则其值将被转换为int类型;否则将被转换为unsigned int类型。
整型转换:将任何整数转换为某种指定的无符号数类型数的方法是,以该无符号数类型能够表示的最大值加1为摸,找出与此整数同余的最小的非负值。
阅读全文