Study C
今天 学了下C,其实是看了下C语言的书 《Linux C编程 一站式学习》
这本书的前言和正文都不错, 非常认同一站式学习、各学科相关联的学习方式。
不过对于P175页的整数常量识别有点小看法,不知正确与否,先记录,后考证
以C99为标准,x86 32位为平台,关于字面量 -2147483648 是识别为 一个负号运算表达式 还是 一个有符号的整数?
区别:作为负号运算表达式 2147483648 超出了 signed int(32) 的范围, 而作为一个有符号的整数正好是最小的那个整数
书中使用 printf("%d",-2147483648) 语句 编译报 警告 format "%d" expects type ‘int’ , but argument 2 has type 'long long int' 为理由
不过,该书并没有专门讨论,而是当作一个有意思的问题,提出来,说明整数常量的复杂性。并没有作为一个论点讨论。
但鉴于该书的严谨的风格,故此小题大作。
这里有三个问题:一个就是上面提到的那个问题。然后是两个引申出来的问题:printf函数和编译器。
上面的那个问题实际上是一个C99标准的问题,如果C99有规定答案自然揭晓,没有规定也自然揭晓(你要是知道C99,你懂得,要是不知道请看最后)。
第二个问题编译器,因为我用 gcc(4.4.5) 编译并没有报上述警告。。。我想说的是 书中用一个编译例子来回答一个C99标准的问题貌似是有欠缺的
第三个问题printf函数,现在的编译器正是强大啊,书中的该例子和printf函数是有关系的吗? 换成 int i = -2147483648?
说下我的编译过程和结果(看清楚喔,是编译结果,不是C99的标准结论. )
编译 int i = -2147483648, 没有任何警告
编译 int i = -2147483649, 警告 隐式常量转换溢出
编译 printf("%d",-2147483648), 还有 printf("%d",-2147483649) 都木有警告。。。。。
嗯 以上三个问题就到这里了。。。。
--------------------------
以下说下C99
C99是C语言的标准,ISO/IEC 9899:1999 的别名
但是呢,作为标准没有把每一个地方都规定,这也不是必要的。有些内容是编译器可以自由发挥的喔
C99没有明确规定的又分为三类:Implementation-defined,Unspecified,Undefined
Implementation-defined 指 C99没有自己规定,但规定了 编译器要明确规定,写在编译器文档中
Unspecified 指 C99没有规定,也没有规定编译器要明确规定,编译器可以自己处理,不必写在文档中,这样同一编译器不同版本也可能不同
Undefined 指 谁都木有提到,说不定连编译器也没确定要怎么处理
综合可见,对于一段C代码,如果是C99规定了的,那运行结果是唯一的,没有规定的运行结果是不唯一的,不同编译器,同一编译器的不同版本都可能不同。
所以,你懂了吧
俺觉得从基础知识学到了C99 ,说明对C的认识上了一个台阶。。。。。O(∩_∩)O~
posted on 2012-10-26 10:16 Simple Love 阅读(536) 评论(0) 编辑 收藏 举报