对无符号类型的建议:
sizeof()返回的类型是无符号类型,
在处理数组下标时需要注意
尽量不要再代码中使用无符号数
尽量使用像int的有符号类型
只有使用位段和二进制掩码时,才使用无符号数
应该在表达式中使用强制类型转化,使操作数均有符号或者无符号,这样不必由编译器来选择结果类型。
strlen(str) 返回的是str的字符的个数,不包含结尾的'/0'
malloc(strlen(str)):几乎可以断定是错误的。
关于switch语句:
1.case和default的顺序是可以任意的,习惯上总是把default放在最后。default后面最好加上break
2.一个遵循标准c的编译器至少允许一条switch语句中有257个case(一个8bit字符和所有情况加上EOF)
3.switch的左花括号的后面可以加上变量声明,语句的执行是从匹配表达式的case开始执行的
4.所有的case都是可选的,任何语句-包括带标签的语句都是允许的,例如 "default"的”L"错误的输入为数字“1”
ANSIC字符串特性:
1.相邻的字符串常量被自动合并成一个字符串,除最后一个字符串外,其余的每个字符串末尾的"/0"字符都被自动删除。
2.这种自动合并意味着字符串数组在初始化时,如果不小心漏掉了一个逗号,编译器不会发现错误信息,二十悄无声息的将两个字符串合并在一起。
const char* array_1[] ={"abc","bcd","cde","def"};
const char* array_2[] ={"abc","bcd" "cde","def"};少了个",",array_2变为:const char* array_2[] ={"abc","bcdcde","def"}
函数的可见性问题
1.在缺省情况下,函数的名字是全局可见的,可以在函数名字前面加个冗余的extern关键字,也可以不加,效果一样。这个函数对于链接到它所在的目标文件的任何东西都是可见的。
2.如果想限制这个函数的访问,就必须加个static关键字。
3.interposition是指用户编写和库函数同名的函数并取代库函数的行为。
4.声明仅在当前文件使用的函数,最好加上static关键字。
c语言的符号重载
static:函数内部,表示该变量的值在各个调用见一直保持延续性,
修饰函数,表示该函数只对本文件可见
extern:修饰函数,表示全局可见
用于变量,表示它在其他地方定义
void:作为函数的返回类型,表示不返回任何值
在指针声明,表示通用指针类型
在参数列表,表示没有参数
c语言优先级实例
apple = sizeof(int) *p <==> apple = (sizeof(int))*p;
如果p是一个指针,这样sizeof(int)*p ,包含的运算符有:sizeof ,(),* 三个运算符。
编译器处理的时候是从左向右建立波兰式,所以它碰到sizeof,就记为操作符号,而后碰到(,就认为里面装的是操作数,所以(int)被理解为操作数,所以就认定是sizeof(int)的结果就是一个操作数,碰到*后,操作数(sizeof(int))后面是一个*,所以*被理解成双目运算符,所以*后面的必须是操作数。
c语言运算符优先级问题
1."."的优先级高于"*","->"操作符用于消除这个问题。
例如:*p.f 被解析成*(p.f) 而不是(*p).f
2."[]"的优先级高于"*"
例如:int *ap[] 被解析成int*(ap[]) :ap是个元素为int指针的数组,而不是int(*ap)[]:ap是个指向int数组的指针
3.函数()的优先级高于*
例如 int*fp()被解析成 int* (fp()) fp是个函数返回int*,而不是 int(*fp)():fp是个函数指针,所指函数返回int。
4."=="与"!="高于赋值运算符
5.算术运算符高于移位运算符、
例如:msb<<4+lsb 被解析为:msb<<(4+lsb);
关于运算符优先级的建议:
记住乘法除法的优先级高于加法和减法,其余的优先级问题都要加括号
x=f()+g()*h()的函数调用顺序问题
g()*h() 代表一个意群,f()代表一个意群,但是意群见之间的顺序c语言并未明确规定操作数计算的顺序
亦即:f() g() h() 的调用顺序不固定。
gets() 函数和fgets()函数
gets()函数是一个过时的函数,用于和最初版本的可移植I/O函数库保持兼容。get()函数不对缓冲区检查,c语言的官方手册中,强烈建议用fgets()彻底取代gets()。
gets(line) ;
替换为:
if(fgets(line, sizeof(line),stdin)==NULL);
exit(1);
#include <cstdio> char *gets( char *str );函数介绍:
The gets() function reads characters from stdin and loads them into str, until a newline or EOF is reached. The newline character is translated into a null termination. The return value of gets() is the read-in string, or NULL if there is an error. Note that gets() does not perform bounds checking, and thus risks overrunning str. For a similar (and safer) function that includes bounds checking, see fgets().
#include <cstdio> char *fgets( char *str, int num, FILE *stream );
函数介绍:
The function fgets() reads up to num - 1 characters from the given file stream and dumps them into str. The string that fgets() produces is always NULL- terminated. fgets() will stop when it reaches the end of a line, in which case str will contain that newline character. Otherwise, fgets() will stop when it reaches num - 1 characters or encounters the EOF character. fgets() returns str on success, and NULL on an error.