摘要:
++和--操作符对应两条汇编指令: 上图中的表达式,我们的初步分析如下: 完整的示例程序如下: vc编译器的额结果如下: i自增了6次,最终为6。但是两个r的值和我们的分析不一样,这是不是错了呢? gcc下的运行结果如下: 两种编译器得到了两种不同的结果,这就是C语言里面的灰色地带。 vc中第8行的 阅读全文
摘要:
C语言中的位运算符: C语言中的位运算效率是最高的。比四则运算效率高很多。 左移和右移: 右操作数超出范围后,行为是不确定的。 有趣的问题: 示例程序如下: 运行结果如下: 从结果可以看出,第8行的混合运算先算的是加法。 vc编译器的输出结果如下: bcc编译器的输出结果如下: 小贴士: 交换两个变 阅读全文
摘要:
有趣的问题: 示例如下: 运行结果如下: 逻辑与的优先级较高并不等于先计算逻辑与,如上图中的等价代换。在逻辑与和逻辑或混合运算时,整个表达式被看成逻辑或表达式。 上图中编译器从左向右依次计算每个括号中逻辑与的表达式的值,这才是真正的在逻辑运算符表达式中逻辑与比逻辑或具有更高优先级的体现。 短路规则示 阅读全文
摘要:
单引号和双引号: 下面的程序片段合法吗? 示例程序: 编译运行结果如下: 小贴士: 上面程序产生错误的原因: 低于0x08048000的地址是不能随便访问的。 printf('\n')会产生段错误,因为printf把'\n'的aisc码当成了地址。aisc码为0x00000010。 如下: 混淆概念 阅读全文
摘要:
C语言中的接续符(\)是指示编译器行为的利器 示例程序如下: 这是一段合法的程序,编译并不会报错。 接续符的使用: 接续符适合于使用在宏代码块中。 宏定义只能在同一行,因此,要想定义多行的宏代码块,那就要借助于接续符。 接续符示例如下: 转义符的意义: 上图中\141表示了一个aisc码的八进制表示 阅读全文
摘要:
下面的注释正确吗? 程序如下: 上述程序在编辑器中的提示如下: 根据颜色变化大概可以看出第7行和第9行是否合法。第9行因为存在换行符,编译器认为我们源码中的第10行和第9行属于一行。 编译信息如下: 注释规则: 有趣的问题: 想要表达除法的意图,可以借助空格,如下所示: 小结: 阅读全文
摘要:
枚举类型的使用方法: enum的地位和struct是相等的,enum主要用来根据需要定义一些离散的值。 枚举类型的特殊意义: 工程中常用无名枚举来定义常量。 程序示例: 运行结果如下: sizeof关键字的用法: sizeof不是函数,而是一个编译器指示符。 示例程序如下: 运行结果如下: 可以看到 阅读全文
摘要:
struct的小秘密:空结构体占多大内存呢? 直观的答案有两种: 1、空结构体的大小为0 2、结构体本来就是为了将不同的变量集合在一起使用的,定义空结构体会导致编译错误 实例分析: gcc编译运行如下所示: 用bcc编译器对上述程序进行编译,结果如下: bcc不允许定义空结构体。 用vc编译器编译结 阅读全文
摘要:
const只读变量: const全局变量的分歧: 测试程序与运行结果如下: 通过指针修改const全局变量的例子: 结果如下: 可见修改const的全局变量会导致程序崩溃。 原因是const全局变量被存储于只读存储区了。 上图是gcc的结果。 但是这个程序在bcc编译器下可以正常运行。 bcc是一款 阅读全文
摘要:
遭人遗弃的goto: C语言是一种面向过程的结构化语言,其中主要结构有三种,顺序执行、选择执行、循环执行。再复杂的程序也是由这三种结构组合而成的。 goto破坏了结构化特性,使程序以第四种方式执行,结构化特性被破坏的越严重程序质量越下降。 现代软件开发中很多企业禁用goto。 goto破坏结构化特性 阅读全文