C(++)语言葵花宝典
1:参加模运算%的两个变量只能是整型,而不能是浮点型。
2:如果参加除法/运算的两个变量均为整型,则结果为除数取整,否则结果就为浮点型。
3:有关字符数组的初始化,有下面两种方法:
(1) char word [2]={‘x’,‘t’};
char word []={‘x’,‘t’};
这种初始化方式未将结束符‘\0’存入数组中。
(2) char word[]={“xt”};
char word[3]={“xt”};
char word[]=“xt”;
char word[3]=“xt”;
这种初始化方式自动将结束符‘\0’存入数组中。
4:要使一个指针指向一个二维数组,int a[3][4],*p=a;是非法语句,把*p=a改成*p=a[0]即可。
5: 使用strcat(a,b)前最好将第一个数组参数初始化a={‘\0’},因为编译器是先识别到a中的‘\0’然后去掉‘\0’并将b中的字符copy过来,自动加‘\0’.
6:getche和getch均包含在conio.h中,但getch()无返回显示,getche有返回显示。这两个函数都是在键盘中读取数据,而getchar包含于stdio.h中,带有返回值显示,而且getchar是从stdin流(缓冲区)中读取数据,如果缓冲区有数据的话不用再由键盘输入就可以读取了。
7:_kbhit()(conio.h)用于监视键盘输入,有输入时返1,否则返0,与getch不同的是,执行getch(),程序等待输入,但_kbhit()并不停留。另外,_kbhit()是检查当前(执行_kbhit()前任意时间)是否有键盘输入,并不是检查缓冲区是否有数据。
8:0x1a在ASCII码中代表EOF,在过去,ASCII码EOF曾经在unix/linux中被作为文件结束符使用,微软继承了这个传统,也以EOF作为文件的结束符.
9:数组名a和&a的区别:
10:空格和空字符的区别
空格字符 指键盘上长长的那个键产生的字符,16进制0x20, 十进制32。而空字符是在字符串结尾系统自动加上的‘\0’(十进制10),以让系统识别出一个字符串的结尾。如字符串“china”实际上在系统内是以“china\0“存储的.
11: 文件打开模式.
(1)r 打开只读文件,该文件必须存在。r+打开可读写的文件,该文件必须存在。
(2)w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
(3)“r”与“w”:当文件不存在时,r+不会创建,而会导致调用失败,但w+会创建。如果文件存在,r+不会自动清空文件,但w+会自动把已有文件的内容清空。另外,r+打开文件后,会把读写指针指向文件的开头(读写间接清空源文件),所以会覆盖已有的文件(4):a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(“+”代表可读可写)。a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。如果是读文件,从文件开始位置读,如果是写文件,从文件结尾处开始写。且这种属性不会被rewind改变。
11:输出许多“烫”字多为数组未初始化;输出许多“屯”字多为数组输出越界。
12:注意if和else的配对原则:else和距其最近的不带else的if配对(也就是说else if中else和if并未配对)。例:
13:初始化类的数组时,如果实参少于形参,编译器会提醒“requires adefault constructor(构造函数)”。
14:关于printf里逗号表达式的问题:给出实例#include
void main()
{
int a=1,b=2;
printf("%d\t",(a=2,a=6));
printf("%d\t",a=2,a=6);//后面一个不会执行?假的!参数顺序为从右至左。
printf("%d\t",(a=3,a));//前一个会执行
//输出结果6 2 3
}
15 关于后缀自加时间的问题
1》++、–作为前缀,先自加或者自减,再做其他运算。
2》逗号表达式,i在遇到每一个分号后,认为本计算单元已经结束,i这个时候自加。
int main()
{
int i = 2;
int j = 0;
j = (i++, i++, i++);
return 0;
}
最后:i=2+1+1+1=5;j=2+1+1=4.
3》也就是说后缀运算是在本单元计算结束后再自加自减的。
16 多个自加处理
i=3;
y=(++i)+(++i)+(++i)+(++i); 这时y的值是多少呢?y=7+7+7+7=28?
正确答案是y=23,i=7。为什么会出现这样的问题?
不理解这个问题,说明你对c语言运算符的运算规则还没有透彻的理解。
这里真实的运算规则是:
由于加法运算符“+”是二元运算符,所以每次运算都只需要2个操作数,运算后结果保存在一个缓存变量ans中。
所以先运算(++i)+(++i),则结果为ans=5+5=10,i=5;
然后再运算ans+(++i),则结果为ans=10+6=16,i=6;
然后再运算ans+(++i),则结果为ans=16+7=23,i=7;
然后赋值y=ans=23;