ANSI C标准是啥
它很棒,但他符合标准吗?
不要添乱———立即解散ISO工作小组
ANSI C标准定义了一些术语来描述编译器的特点,如果你对这些术语有一个比较好的了解有助于理解什么能被语言接受,什么不能被语言接受。
不可移植的代码(Unportable code)
由编译器定义的(implementation-definded)——由编译器设计者决定采取何种行动。换句话说就是在不同的编译器中所采取的
行为
可能并不相同,但他们都是正确的。eg: 当整型数向右移位时,要不要扩展符号位。
未确定的(unspecified)——在某些正确情况下的做法,标准并未明确规定应该怎样做。实质上未确定的代码由编译器自己决定怎么做,
eg:参数求值的顺序
坏代码(bad code)
未定义的(undefined)——在某些不正确情况下的做法,但标准并未规定应该怎样做。你可以采取任何行动,可以什么也不做,也可以发出一条警告信息,或者终止程序以及让CPU陷入瘫痪,甚至发射核弹(只要你安装了能发射核弹的硬件系统)。
eg:当一个有符号整数溢出时应采取什么行动。
约束条件(a constraint)——这是一个必须遵守的限制或要求。如果你不遵守,那么你的程序的行为就会变成像上面所说的属于未定义的。这时会出现一种有意思的情况:分辨某东西是否是一个约束条件比较容易,因为标准的每个主题都附有一个“约束(constraint)”小节,列出了所有的约束条件。但是标准规定编译器只有在
违反语法规
则和约束条件
的情况下才能产生错误信息
!这意味着所有不属于约束条件也不属于违反语法规则的语义规则你都可以不遵循,而且这种行为属于未定义行为,编译器可以采取任何行动,比如发射核弹。eg:%操作符的操作数必须是整型。所以在非整型数据上使用%操作符肯定会引发一条错误信息。
eg:所有在C语言标准头文件中声明的标识符均保留,所以不能声明一个叫malloc()的函数,因为标准头文件里已经有一个函数以此命名,但由于这个规定不是约束条件,因此可以违反它,而且编译器也可以不警告你!
可移植的代码(portable code)
严格遵循标准的(strictly-conforming)————严格遵循标准的程序应该是:
- 只使用已确定的特性
- 不突破任何由编译器实现的限制
- 不产生任何依赖由编译器定义的或未确定的或未定义的特性的输出。
这样规定的最主要的目的就是保证可移植性。
这样,不论你在什么平台上运行严格遵循标准的程序又会有相同的输出。
遵循标准的(conforming)——一个遵循标准的程序可以依赖一些某种编译器特有的不可移植的特性。
——————《C专家编程》