C语言知识点(一)

           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<stdio.h>

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

 

            

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月小水长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值