您的位置:首页 > 其它

[算法]算法竞赛入门经典第4章笔记

2014-01-01 17:15 429 查看
1.  数学函数的定义“返回类型 函数名(参数列表){函数体}”函数体最后一条语句应该是“return表达式;”。
2.  Main函数总是返回0
3.  Hypot函数
原型:extern float hypot(float x, float y);
用法:#include <math.h>
功能: 计算直角三角形的斜边长
用法: double hypot(double x, double y);
例:
#include <stdio.h>
#include <math.h>
int main(void)
{
    double result;
    double x = 3.0;
    double y = 4.0;
    result =hypot(x, y);
    printf("Thehypotenuse is: %lf\n", result);
    return 0;
}
4.  定义结构体的方法:“struct 结构体名称{域定义};”花括号后还有分号
5. 往往用“typedef struct{域定义;}类型名;”方式定义一个新类型名,这一可以像原生数据类型一样使用这个自定义类型。
6. 注意避免溢出。
7. 谓词函数命名成is_xxx的形式;返回int值,非0为真,0为假
8. int is_prime(intx)
{

    inti;

    for(i=2;i*i<=x;i++)

    if(x%i==0)return0;

    return1;

}

9. assert()是一个诊断宏,用于动态辨识程序的逻辑错误条件。其原型是: void assert(int expression); assert只是对所给的表达式求值,就像if判断语句中一样,然后如果该值为真则正常运行,否则报错,并调用abort(),产生异常中断,exit出来。使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

在调试结束后,可以通过在包含#include<assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

  #include<stdio.h>

  #define NDEBUG

  #include<assert.h>

注意:assert是宏,而不是函数。在C的assert.h头文件中。

1)对非预期错误使用断言2)不要把需要执行的代码放入断言中

3)对来源于内部系统的可靠的数据使用断言,而不要对外部不可靠的数据使用断言,对于外部不可靠数据,应该使用错误处理代码。再次强调,把断言看成可执行的注释。

10.调用栈,由多个栈帧stack frame组成,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量,保证不同函数间的局部变量互不相干,因为不同函数对应着不同的栈帧。Gdb中可用backtrace命令打印所有栈帧,若要用p打印非当前栈帧的局部变量,可以用frame命令。







11.*a是指“a指向的变量”,而不仅是“a指向的变量所拥有的值”

用int*a声明的变量a是指向int型变量的指针。赋值a=&b的含义是把变量b的地址存放在指针a中,表达式*a代表a指向的变量,它既可以放在赋值符号的左边,也可以放在右边。

12.不要滥用指针,可能会把自己搞糊涂。

13.Unix/Linux可执行文件格式ELF,dos下是COM,COFF格式,windows下是PE。具有共同的概念--段。Segmentation是指二进制文件内的区域,所有某种特定类型信息被保存在里面。Size程序可以求各个段的大小



在可执行文件中,正文段(textsegment)储存指令,数据段(data segment)储存已初始化的全局变量,BSS段(BSS segment)储存未赋值的全局变量所需的空间。

堆栈段(运行时创建),存放调用栈和局部变量。如果越界访问,会出现段错误。栈帧过多,可能导致段溢出。

14.栈大小Linux下ulimit –a可显示当前栈大小,而ulimit –s 32768将把栈大小指定为32MB,windows使用gcc可指定可执行文件的栈大小,gcc –Wl,--stack=16777216,这样栈大小就变成了16MB

栈大小是有链接程序ld指定的,gcc编译参数-Wl的作用正是把其后的参数传递给ld

15.C语言程序设计奥秘

16.gcc 命令的常用选项

选项 解释

-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,

例如 asm 或 typeof 关键词。

-c 只编译并生成目标文件。

-DMACRO 以字符串“1”定义 MACRO 宏。

-DMACRO=DEFN 以字符串“DEFN”定义 MACRO宏。

-E 只运行 C 预编译器。

-g 生成调试信息。GNU 调试器可利用该信息。

-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。

-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。

-lLIBRARY 连接时搜索指定的函数库LIBRARY。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息