第一次讲座盲点整理(C类型与运算)

来源:互联网 发布:算法 第4版 带目录 编辑:程序博客网 时间:2024/05/20 16:01
1、C,C++版本演变:C89 -> C99 -> C11   ||   C++98 -> C++03 -> C++11

2、C99新增关键字、数据类型: _Bool,_Complex,_Imaginary,inline,restrict

       _Bool:布尔类型,C++中有这个类型,其仅有0和1两个值。以便程序员能够编写同时兼容于C与C++的应用程序。在编写新  的应用程序时,应该使用<stdbool.h>头文件中的bool宏。

        _Complex和_Imaginary:

       C99标准中定义的复数类型如下:
        float _Complex;

        float _Imaginary;

        double _Complex;

        double _Imaginary;

        long double _Complex;

        long double _Imaginary.
        <complex.h>头文件中定义了complex和imaginary宏,并将它们扩展为_Complex和_Imaginary,因此在编写新的应用程序时,应该使用<complex.h>头文件中的complex和imaginary宏。这种新的复数类型的另外一个很强的优势在于,它被归为了算术类型(Arithmetic Types),因此可以直接作为"+"、"-"、"*"、"/"运算符的操作数。

        附:C99新特性:http://blog.163.com/xiongpeng1019@126/blog/static/9804626320107891433261/


3、char型的符号问题

        C标准并没有规定char型是有符号的还是没有符号的。在自己的x86,gcc4.7.2版下做个实验。

       已知  unsigned char取值范围是 0~255signed char取值范围是 -128~127

#include <stdio.h>int main(void){    signed char x = 200;    unsigned char y = 200;    char z = 200;    printf("signed char 200:%d\n",x);    printf("unsigned char 200:%d\n",y);    printf("char 200:\n",z);    return 0;}

输出:

signed char 200:-56unsigned char 200:200char 200

        由此可见,在x86,gcc4.7.2下,是把char默认为无符号型的。


4、浮点数的表示

        整型数的存储方式已经看过很多次了,寒假的时候因为需要,了解过一次浮点数的存储方式,但是因为其内容比我想象的复杂的多,便没有耐心地看下去。现贴出来两份IEEE 754文档,有时间学习。

        http://www.cnblogs.com/kingwolfofsky/archive/2011/07/21/2112299.html

        http://blog.sina.com.cn/s/blog_542858d10100fm0v.html


5、有关register

        曾经一直以为register这个修饰符就是“命令”编译器将被修饰的变量将其放入寄存器中,但是今天欢神讲座时特意提醒,这不是一个“命令”,而仅仅是一个“建议",最终该变量有没有被放入寄存器,是取决于编译器的。

       “随着编译程序设计的进步,在决定那些变量应该被存到寄存器中时,现在的C编译环境能比程序员做出更好的决定。实际上,许多编译程序都会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令。”

                                                                                                      ——百度百科register词条

        在查阅学校课本的时候还发现一个比较过时的说法:

        “由于受硬件寄存器长度的限制,所以寄存器变量只能是char,int,short或指针型。”   课本P155

       可能是由于课本还是16位机的TC环境因为吧,在网上查询,现在的register已经可以修饰float型变量了。

       “For a floating point variable, register storage (whether directed or not) may be affected by the presence or otherwise of an FPU.A single precision floating-point value is 32 bits, on a 32 bit processor it will fit entirely in a register. FPU registers are larger if the FPU supports double precision.”

                       ——from  http://forums.devshed.com/c-programming-42/float-variable-in-register-storage-class-838868.html

        对于一个浮点型变量来说,无论直接与否,是否能将其存储于寄存器中不仅取决于当前环境(编译器?),还取决于FPU(浮点运算处理器,集成在CPU中)。一个单精度的浮点数是32位,在一个32位和处理器中,它会被很容易地放入寄存器中去。如果FPU支持双精度浮点数的话,那么寄存器支持的位数还会更大些。


6、x86平台下,将一个short型变量赋值给一个int型变量,前面多出来的2字节在补齐时补的全部是符号位。而进行右移操作时,有符号数在右移时补齐符号位,无符号数补齐0。  


7、就像“[]”这个俗称“方括号”的操作符有一个专业名称叫作“变址运算符”一样,“*“这个每天都被称作“星”的操作符,也有着它专业的叫法——“解引用”。指针存放的是它指向的变量的地址,解引用,就是引用它指向的变量的地址里的值。就当作是“解”和“引用”两个词就复合来理解就好,挺好理解的。、


8、序列点,副作用:

       序列点,简单理解就是按时间顺序排列的点。程序中,按计算顺序的时间排列的点或位置。例如:C语言中有些“复杂表达式”(逗号表达式,连续赋值表达式)意思表达很含混。只有整个计算式计算完后,才尘埃落定,“副作用消失”,那么,计算式计算完后才算一个 “序列点”。

       ANSI/ISO C 标准:在上一个和下一个序列点之间,一个对象所保存的值至多只能被表达式的计算修改一次。而且前一个值只能用于决定将要保存的值。

       搜集到了两份对序列点和副作用比较详细的说明:

        http://blog.csdn.net/localvar/article/details/3622074

        http://tieba.baidu.com/p/673634549

        PS:网上的C99序列点列表竟然都是英,还得自己动手翻译了:

       (1)、函数调用,在参数被求完值后;

       (2)、在下列操作符的第一个操作对象的末尾:

                1)、逻辑运算“与” &&

                2)、逻辑运算“或“ ||;

                3)、条件运算? :

               4)、逗号运算符    ,

       (3)、一个完整的声明符后;

       (4)、在一个完整的下列情况后:

                1)、初始化操作;

                2)、在一个表达式语句中的表达式;

               3)、选择语句(或switch语句)中的控制语句;

               4)、while和do循环中的控制语句;

                5)、for语句中的每一个表达式

                6)、return语句中的表达式.


9、大端和小端

        Big-Endian和Little-Endian的定义如下:
        Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

        Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

        一份对于大端和小端比较详尽易懂的说明:

        http://blog.csdn.net/ce123/article/details/6971544

      

原创粉丝点击