c诡异离奇,缺陷重重,却获得了巨大的成功

编译器设计者的金科玉律:效率=一切

c预处理器:1.字符串替换 2.头文件包含 3.通用代码模板的扩展

预处理一定要使用强制类型转换!!!明确数据类型

每一个ANSI C编译器必须能够支持

@在函数定义中形参数量的上限至少可以达到31个。

@在函数调用时实参数量的上限至少可以达到31个。

@在一个源代码行里至少可以有509个字符

@在表达式中至少可以支持32层嵌套的括号

@long int的最大值不得小于2147483647(不得低于32位)

标准设立后轻易不作变动,即使是修改错误

const和*的组合通常只用于在数组形式的参数中模拟传值调用。他声称“我给你一个指向他的指针,但你不能修改它”,这个约定类似于极为常见的void*用法,尽管在理论上他可以用于任何情形,但通常被限制于把指针从一种类型装换到另一种类型。

const int limit = 10;

const int *lp = &limit;

lp是一个指向常量整型的指针。这个指针不能用于修改这个×××数,但在任何时候,这个指针本身的值却可以改变。这样,它指向了不同的地址,对它进行解除引用操作会得到一个不同的值。

安静的改变

1.算数转换 2。字符和整型(×××升级)3.寻常算数转换

(无符号保留原则)当一个无符号类型与int或更小的整型混合使用时,结果类型是无符号类型。 对应的就是(值保留原则(可能是有符号数,可能是无符号数,取决于操作数的类型的相对的大小))

尽量不用无符号数!!!

sizeof返回unsigned int

只有在使用位段和二进制掩码时,才可以使用无符号数。可以使用强制类型转换

一个L的NUL用于结束一个ASCII码零的正确术语。

两个L的NULL用于表示什么也不指向(空指针)。

 

i = 1, 2;

因为=运算符高于,所以(i=1)后,i被赋值为1, 2这个运算无意义,最终i = 1

 

 

 Shell参数解析:

要找出目录中的哪些文件时链接文件:ls -l | grep link

maximal munch strategy(最大一口策略)

函数中,不能把局部变量的指针,作为返回值

解决办法:

@返回一个指向字符串常量的指针(只适用于简单的字符串)

char* func(){reutrn "wahaha!";}

@使用全局声明的数组

@使用静态数组(和全局数组一样,大型缓冲区若果闲置不用,非常浪费内存空间)

@显式分配一些内存,保存返回的值

char * func(){

char *s = malloc(20);

return s;

}

它应用于多线程的代码。缺点在于程序员必须承担内存管理的责任

@最好由调用者分配内存来保存函数的返回值。

void func(char* result, int size){

}