C诡异离奇,缺陷重重,却获得了巨大的成功。
这句话不是我说的,是Dennis Ritchie说的。在《C专家编程》这本书里面的第一章就是C:穿越时空的迷雾,第一句就是这句话。
C 语言确实非常风行,我在大学时还是Turbo 2.0的年代,C语言在DOS下有一统天下之势。不过当时还有pascal,这个语言其实是个良好的结构化的语言——至少远比C严谨。所以在当时开课 的时候,pascal也是和C同等地位的可以选修的课,不过今天估计不会再开这门课了。
看下面一段代码:
int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
main()
{
int d = -1, x;
if(d <= TOTAL_ELEMENTS - 2)
{
x = array[d+1];
}
}
代码似乎没有问题,但事实上,if语句判定条件为FALSE。
?!
因为sizeof的返回类型为unsigned类型的,于是d也就悄悄转型成了unsigned类型,做为-1的d忽然成了一个庞大的数,if的判断就出乎意料了。
......
类似的问题不是编译器的问题,也不是库函数的问题,而是C语言本身的问题。
这句话不是我说的,是Dennis Ritchie说的。在《C专家编程》这本书里面的第一章就是C:穿越时空的迷雾,第一句就是这句话。
C 语言确实非常风行,我在大学时还是Turbo 2.0的年代,C语言在DOS下有一统天下之势。不过当时还有pascal,这个语言其实是个良好的结构化的语言——至少远比C严谨。所以在当时开课 的时候,pascal也是和C同等地位的可以选修的课,不过今天估计不会再开这门课了。
看下面一段代码:
int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
main()
{
int d = -1, x;
if(d <= TOTAL_ELEMENTS - 2)
{
x = array[d+1];
}
}
代码似乎没有问题,但事实上,if语句判定条件为FALSE。
?!
因为sizeof的返回类型为unsigned类型的,于是d也就悄悄转型成了unsigned类型,做为-1的d忽然成了一个庞大的数,if的判断就出乎意料了。
......
类似的问题不是编译器的问题,也不是库函数的问题,而是C语言本身的问题。