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){
}