语言篇
scanf问题(P28)
当结束输入时,scanf无法再次读取,x将返回0。
scanf在无法读入的时候返回EOF,至少ubuntu下GCC clang是这样的。
浮点数问题(P32)
i = 1.700000000000000004
#include <stdio.h>
int main()
{
double i;
for (i = 0; i != 10; i += 0.5)
printf("%.1f", i);
return 0;
}
因为浮点数在机器内的实际储存方式,所以是有误差的。
大部分十进制小数不能准确换成二进制小数
大的数组(P38)
比较大的数组应尽量声明在main函数外,否则程序可能无法运行.
在main主函数内数组, 在内存栈区申请,容易爆栈,而在main函数外的数组,实在内存的数据区申请,空间较大.
书中使用的是从数据区申请空间,是比赛中的用法,这里演示一下大的数组正式的用法(在工程中):
从堆内存中申请空间
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
//从堆内存中申请空间,(*a)[2],是一个指向数组的指针,即行指针
int (*a)[2] = malloc(sizeof(int) * 2 * 2);
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;
printf("%d", **a); //a[0][0]
printf("%d", *(*a + 1)); //a[0][1]
printf("%d", **(a + 1)); //a[1][0]
printf("%d", *(*(a +1) + 1));//a[1][1]
return 0;
}
补充:内存四区:
代码区,数据区(包含静态区和常量区),栈区,堆区.
数组清零(P39)
memset(a, 0, sizeof(a));作用把a数组清零
main函数及子函数内的数组(即栈内存中的数组)可以直接在申请的时候清零,
int a[100] = { 0 };
在main函数外的数组(静态区的数组)自动初始化为0,无需手工清零.
未定义行为(P44)
int count = 0;
printf(“%d %d %d”, count++, count++, count++);
GCC,CL(vc++):
2 1 0
clang/LLVM(xcode):
0 1 2
拼写错误(P50)
类似的还有idigit…
应该为 isdigit