算法竞赛入门经典第二版的学习

来源:互联网 发布:html网页制作软件 编辑:程序博客网 时间:2024/05/22 04:37

语言篇

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

0 0
原创粉丝点击