1.根据编译器设计者打思路发展而形成的特性:
数组下表从0而不是从1开始;
C语言打基本数据类型直接与底层硬件相适应。(C语言一开始并不支持浮点类型,直到硬件系统能够直接支持浮点数之后才增加了对它的支持);
auto关键字显然是摆设;
不允许嵌套函数
2.C预处理器的3个主要功能是:
字符串替换(为常量提供一个符号名);
头文件包含;
通用代码模板的扩展(宏的使用)
3.ANSI C中描述了一些关于不可移植,坏代码和可移植代码的术语。
不可移植代码:
编译器定义的; 如整数向右移位时,要不要扩展符号位
未确定的--某些(正确)情况下的做法,标准并未规定应该怎么做。 如参数求值顺序。
坏代码:
未定义的--某些不正确情况下的做法,但标准并未规定应该怎样做。如一个有符号数溢出时该采取什么行动。
约束条件--必须要遵守的限制或要求。标准规定编译器只有在违反语法规则和约束条件的情况下才能产生错误信息。这意味着所有不属于约束条件的语义规则你都可以不遵守。
如: %操作符的操作数必须属于整数。所以,在非整数数据上使用%操作符肯定会引发一条错误信息;
所有在C语言标准头文件中声明的标志符均保留,但这个规定不是约束条件,因此可以违反它,而且编译器甚至可以不给你警告。
可移植的代码: 严格遵循标准的。
4.应该在表达式中使用强制类型转换,使操作数均为有符号数或者无符号数,这样就不必由编译器来选择结果的类型。
int array[] = {1,2,3,5};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
int d = -1;
if(d<= (int)TOTAL_ELEMENTS -2) // d会被转换成unsigned int
{
cout<<"yes---------"<<endl;}