Good,True and Beautiful

Good Good Study, Day Day Up

导航

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编辑  收藏  举报