重读 c primer plus

第三章 数据和c
1.C将字符常量是为int类型而非char类型。意味着'b'作为数值66存储在一个32位的单元中,而赋值后的

grade则把66存储在一个8位单元中。
    char grade = 'b';
    printf("grade is %c/n",grade);
    grade = 'fate';
    printf("grade is %c/n",grade);
   
2.再将浮点值转换为整数时,c简单的丢弃小数部分(截尾),而不进行四舍五入。
3.使用%d显示float值不会把该float值转换为近似的int值,而是显示垃圾值。与之类似,%f显示int值

也不会把该int值转换为浮点值。
http://topic.csdn.net/u/20090305/22/6365501d-844e-4fd4-9905-ac1c703ba05a.html
原因在于printf,printf不会关心你输入的参数的类型,你输入的实际是printf("%f",3),但是这个整

型3不会被隐式类型转换为浮点型,而是被直接按内存内容当作浮点型也就是说,内部使用等价于
int i = 3;
printf("%f", *(float*)&i)
不幸的是,整型3在内存布局上如果看成浮点数,它就是接近于0,这是不定参数的特点,没有类型检查

,没有类型转换
完整的说明一下吧。
首先 printf("%f",10/3);等价于 printf("%f",3);也就是说在这种情况下C不支持类型转换。并且"%f"

处理的是double类型的浮点数也就是64位,而且默认的显示精度是小数点后6位。然后要考虑浮点数的表

示方法,根据IEEE 754标准对64位浮点数采用的表示为:
  数符(1位)| 阶码 (11位) | 尾数 (52位)
好了,可以解决问题了。你的3是62个0 + 11, 知道为什么了吧? 数太小了! 在仅仅可以显示小数点6

位的情况下,这么小的数是显示不出来的,那也就只有等于 0.000000 了。
4.标准c规定在:缓冲区满的时候,遇到换行符的时候以及需要输入的时候将缓冲区内容传给屏幕。

第四章字符串和格式化输入、输出
1.c没有为字符串定义专门的变量类型,而是把它存储在char数组中。
2.sizeof圆括号对于类型是必须的,对于变量是可选的。
3.printf()和scanf()的*修饰符,前者指定字段宽度,后者跳过相应输入

第五章运算符、表达式和语句
1.整数除法结果中的小数部分都被丢弃。整数和浮点数做除法将整数转化为浮点数。
2.sizeof是运算符,返回size_t类型值,这是一个无符号整数类型。
3.类型转换节本规则:
(1)在包含两种数据类型的人和运算里,两个值都被转换成两种类型理较高的类型
(2)当作为函数的参数被传递时,char和short会被转换成为int,float会被转换成为double。

第六章C控制语句:循环
1.逗号是个顺序点,逗号左边产生的所有副作用都在程序运行到逗号右边之前生效。整个逗号表达式的

值是右边成员的值。
2.在进行复杂计算之前,看看数学上有没有更容易的方法来解决它。

第七章 c控制语句:分支和跳转
1.getchar() 见csdn专题:c误区 int ch;

第八章 字符输入输出和输入确认
1.scanf在读取数字时会跳过空格制表符和换行符。注意是跳过。scanf如果没有成功读取输入,就会将

其留在输入队列中。
2.while(scanf("%d",%input)!=1)

第九章函数
1.return的另一个作用是中止执行函数。
2.printf()可以使用下面的原型声明:int printf(char *,....); 参见第十一章
3.递归有时可用来代替循环,反之亦然。
4.使用递归来处理反序问题。比如进制转换。

第十章:数组和指针
数组初始化
1.与普通变量相似,在初始化之前数组元素的数值时不定的。
2.当数值数目少于数组元素数目是,多余的数组元素将被初始化为0。
3.可以指定初始化项目及两个重要特性。(C99)
数组赋值:
1.c不支持将数组作为一个整体来赋值。也不支持用花括号括起来的列表形式进行赋值(初始化的时候除

外)
2.在使用数组大小的地方直接引用符号常量来避免数组越界。

3.数组名是该数组首元素的地址。
4.指针的数值是它所指向的对象的地址。对象的地址通常指的是其首字节的地址。
5.c语言标准在描述数组时,借助了指针的概念:例如:定义a[n]时,即“寻址道内存中的a(注意a是数

组首元素的地址),然后移动n个单位(注意不是n个字节),再取出数值。”
6.当创建一个指针时,系统只分配了用来存储指针本身的内存空间,并不分配用来存储数据的内存空间

。因此在使用指针之前必须给它赋予一个已分配的内存地址.
7.只有非常量数据的地址才可以付给普通的指针。
    const int locked[2] = {3,4};
    int *pn = locked;//非法
8.const int *p和 int  * const p  还有 const int * const p;
9.指向多维数组的指针 int* pn[2]
10.变长数组的声明方式注意顺序。
11.在数组形式中数组名是个常量 int a[2]; a++;非法

第十一章 字符串和字符串函数
1.初始化字符串的时候,数组初始化是从静态存储区把一个字符串复制给数组,而指针只是复制字符串

的地址。
2.声明字符串数组:char *strings[2] 和char string[2][20];
3.fgets()读取换行符并保存到字符串里面。
4.puts遇到空白符停止输出。

你可能感兴趣的:(重读 c primer plus)