`
kmplayer
  • 浏览: 508937 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

第一章 C:穿越时空的选择

阅读更多
1,编译器设计者的金科玉律:效率.
编译器的效率:
(1)编译时效率(产生可执行代码的速度)
(2)运行时效率(可执行代码运行的速度)

2,刚开始,C语言的客户主要是编译器设计者.
因此,C语言的许多特性是为了方便编译器设计者而设定的.
(1)数组的下标从0开始.
(2)C语言的基本数据类型与底层语言相关联.
(3)auto关键字,摆设.
缺省的变量内存分配模式:"进入程序块时,自动分配内存"(对应于全局静态分配或堆上动态分配)
(4)不允许嵌套函数.

3,K&R C:1978年,The C Programming Language出版,作者:Brian Kernighan和Dennis Ritchie.
C语言的演化之路:  早期的C(1972-3)-->K&R C(1976-9)-->ANSI C(1983-9)
ANSI:美国国家标准化组织.

4,一些术语:
不可移植的代码
(1)由编译器设计者决定采用何种行为.如:整数右移时,符号位的扩展.
(2)未确定的.如:参数求值的顺序.

坏代码:
(1)未定义的,不正确的做法,但标准没有规定应该怎样做.如:有符号整数溢出时,采取什么行动.
(2)约束条件:必须遵循的限制或要求.
标准规定:编译器只有在违反语法规则和约束条件的情况下才产生出错信息.
意味着:不违反约束条件的语法规则可以不遵循.
例如:可以声明一个malloc()函数.

可移植的代码:
一个严格遵循标准的程序,应该是:
(1)只使用已经确定的特性.
(2)不产生任何依赖由编译器定义的或未确定的或未定义的特性的输出.

5,关于数值类型的转换:
(1)当执行算术运算时,如果数值类型不同,就会发生转换.
(2)数据类型一般朝着精度更高,长度更长的方向转换.
(3)整型数如果转换为signed不会丢失信息,就优先转换为signed,否则转换为unsigned.

6,给定下面的程序的:
#include<stdio.h>
int data[]={1,2,3};
#define SN (sizeof(data)/sizeof(data[0]))

int main()
{
    int d=-1;
    printf("%d\n",d<SN); //bug:if语句测试时,d被升级为unsigned类型.
    printf("%d\n",d<(int)SN);
    return 0;
}

建议:
(1)尽量不要在代码中使用无符号类型.不要因为无符号不存在负数,就用来表示数量.
(2)只有在使用位段和二进制掩码时,才使用无符号类型.
(3)在表达式中使用强制类型转换,使操作数均为signed或unsigned.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics