1.表达式中float类型的操作数不会自动转换为double类型。一般来说,数学函数(如math.h)使用双精度类型的变量。使用float类型主要是为了在使用较大数组时节省存储空间,有时也为了节省机器执行时间(双精度算数元算特别费时)。
2.scanf函数调用时,字符串类型不需要写‘&’,因为其本身即为地址。
3.EOF可能被定义为不同的值,使用EOF等标准符号可以增强程序的可移植性,常见值有-1。
4.根据某种特定的状态做不同的行为,可以用define定义状态量,然后定义int state。如:
#define IN 0 #define OUT 1 ... if(state == IN) ... else //OUT ...
5. ~(~0<<n) 得到最右边n位为1,其他位是0.
6.条件表达式
每10行一个换行符:
for(i=0;i<n,i++) printf("%6d%c",a[i],(i%10==9||i==n-1)? '\n':' ');
是否复数的s
printf("You have %d item%s.\n",n,n==1?"":"s");
7.在switch语句中,case的作用只是一个标号。
8.break只能跳出其所在的一级到上一级,而不是所有层次。
9. getch和ungetch 超前读并放回一个字符
#define BUFSIZE 100 char buf[BUFSIZE];//for ungetch to buffer int bufp=0;//the next spare index of buf int getch(void) { return (bufp>0) ? buf[--bufp] : getchar(); } void ungetch(char c) { if(bufp >= BUFSIZE-1) printf("ungetch: too many characters\n"); else buf[bufp++]=c; }
10. 一个外部变量只能在某个文件中定义一次,而其他文件可以通过extern声明来访问他。外部变量的定义必须指定数组的长度,但extern声明则不一定要指定数组的长度。外部变量的初始化只能出现在其定义中。
11.在函数中,可以以程序块结构的形式定义变量,例如for语句的花括号。
12.在不进行显式初始化的情况下,外部变量和静态变量都将被初始化为0,而自动变量和寄存器变量的初值则没有定义。
对于外部变量和静态变量来说,初始化表达式必须是常量表达式,且只初始化一次(在概念上讲是在程序开始执行前进行初始化)。
对于自动变量和寄存器变量,则在每次进入函数或程序块时都将被初始化,可以不是常量表达式。
数组的初始化,如果初始化表达式的个数比数组元素少,则对外部变量、静态变量和自动变量来说,未被初始化的元素将被初始化为0。若初始化表达式的个数比数组元素多,则是错误的。
13.将一个数作为字符串打印
/*print decimal as string*/ void printd(int n) { if(n<0){ putchar('-'); n=-n; } if(n/10) printd(n/10); putchar(n%10+'0'); }