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

语言篇

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值