时间:2018-11-4来源:本站原创作者:佚名

点击蓝字

  如果需要大数值(大于32,或小于?32,),使用long型。否则,如果空间很重要(如有大数组或很多结构),使用short型。除此之外,就使用int型。如果严格定义的溢出特征很重要而负值无关紧要,或者你希望在操作二进制位和字节时避免符号扩展的问题,请使用对应的无符号类型。但是,要注意在表达式中混用有符号和无符号值的情况。尽管字符类型(尤其是无符号字符型)可以当成“小”整型使用,但由于不可预知的符号扩展和代码增大有时这样做可能得不偿失。使用无符号字符型有所帮助;

2.longlong类型如何使用?

  C99标准定义了longlong类型,其长度可以保证至少64位,这种类型在某些编译器上实现已经颇有时日了。

  最关键的是:

  1.64位硬件。现在几乎所有的同学们接触到的设备都是64位的了(包括实验室图书馆信息楼的计算机)

  2.64位操作系统。基本所有的4GB以上内存的设备都是64位系统(学校的计算机统一使用32位也就是x86版本的系统)

  3.64位的编译器。这也是目前所有使用自己笔记本电脑Windows系统的同学们所面临的问题。同学们使用的电脑前两个条件都满足,但是codeblock和VC自带的编译器都是32位的,需要用longlong类型还需要自己下载安装64位编译器。

3.怎样定义和声明全局变量和函数最好?

  首先,尽管一个全局变量或函数可以(在多个编译单元中)有多处“声明”,但是“定义”却只能允许出现一次。定义是分配空间并赋初值(如果有)的声明。最好的安排是在某个相关的.c文件中定义,然后在头文件(.h)中进行外部声明,在需要使用的时候,只要包含对应的头文件即可。定义变量的.c文件也应该包含该头文件,以便编译器检查定义和声明的一致性。这条规则提供了高度的可移植性:它和ANSIC标准一致,同时也兼容大多数ANSI前的编译器和连接器。Unix编译器和连接器通常使用“通用模式”允许多重定义,只要保证最多对一处进行初始化就可以了;ANSIC标准称这种行为为“公共扩展”,没有语带双关的意思。

3.函数只定义了一次,调用了一次,但编译器提示非法重定义了。

  在范围内没有声明就调用(可能是第一次调用在函数的定义之前)的函数被认为返回整型(int)(且没有任何参数类型信息),如果函数在后边声明或定义成其它类型就会导致矛盾。所有函数(非整型函数一定要)必须在调用之前声明。另一个可能的原因是该函数与某个头文件中声明的另一个函数同名。

4.为什么sizeof返回的值大于结构的期望值,是不是尾部有填充?

  为了确保分配连续的结构数组时正确对齐,结构可能有这种尾部填充。即使结构不是数组的成员,填充也会保持,以便sizeof能够总是返回一致的大小。

5.chara[]和char*a是一样的吗?

  并非如此。(你所听说的应该跟函数的形式参数有关;参见问题6.4)数组不是指针。数组定义chara[6]请求预留6个字符的位置,并用名称“a”表示。也就是说,有一个称为“a”的位置,可以放入6个字符。而指针申明char*p,请求一个位置放置一个指针,用名称“p”表示。这个指针几乎可以指向任何位置:任何字符和任何连续的字符,或者哪里也不指

一个图形胜过千言万语。声明chara[]="hello";char*p="world";将会初始化下图所示的数据结果:

+---+---+---+---+---+---+

a:

h

e

l

l

o

\0

+---+---+---+---+---+---+

+-----++---+---+---+---+---+---+

p:

*======

w

o

r

l

d

\0

+-----++---+---+---+---+---+---+

根据x是数组还是指针,类似x[3]这样的引用会生成不同的代码。认识到这一点大有裨益。以上面的声明为例,当编译器看到表达式a[3]的时候,它生成代码从a的位置开始跳过3个,然后取出那个字符.如果它看到p[3],它生成代码找到“p”的位置,取出其中的指针值,在指针上加3然后取出指向的字符。

6.为什么大家都说不要使用gets()?

  跟fgets()不同,gets()不能被告知输入缓冲区的大小,因此不能避免缓冲区的溢出。标准库的fgets()函数对gets()作了很大的改进,尽管它仍然不完善。如果真的可能输入很长的行,还是需要仔细思考,正确处理。参见问题7.1用fgets()代替gets()的代码片断。

7.为什么大家都说不要使用scanf()?那我该用什么来代替呢?

  scanf()有很多问题,而且,它的%s格式有着和gets()一样的问题。

  更一般地讲,scanf()的设计使用于相对结构化的,格式整齐的输入。设计上,它的名称就是来自于“scanformatted”。如果你注意到,它会告诉你成功或失败,但它只能提供失败的大略位置,至于失败的原因,就无从得知了。对scanf()多得体的错误恢复几乎是不可能的;通常先用类似fgets()的函数读入整行,然后再用sscanf()或其它技术解释。strtol(),strtok()和atoi()等函数通常有用;如果你真的要用任何scanf的变体,你要确保检查返回值,以确定找到了期待的值。而使用%s格式的时候,一定要小心缓冲区溢出。

8.用scanf%d读取一个数字,然后再用gets()读取字符串,但是编译器好像跳过了gets()调用!

  scanf%d不处理结尾的换行符。如果输入的数字后边紧接着一个换行符,则换行符会被gets()处理。作为一个一般规则,你不能混用scanf()和gets(),或任何其它的输入例程的调用;scanf对换行符的特殊处理几乎一定会带来问题。要么就用scanf()处理所有的输入,要么干脆不用。

9.当我用“%d\n”调用scanf从键盘读取数字的时候,好像要多输入一行函数才返回。

  可能令人吃惊,\n在scanf格式串中不表示等待换行符,而是读取并放弃所有的空白字符。

10.这样的代码有什么问题?charc;while((c=getchar())!=EOF)

  第一,保存getchar的返回值的变量必须是int型。getchar()可能返回任何字符值,包括EOF。如果把getchar的返回值截为char型,则正常的字符可能会被错误的解释为EOF,或者EOF可能会被修改(尤其是char型为无符号的时候),从而永不出现。

责编:于聪

审核:李佳美

赞赏

长按







































专业的白癜风医院
白癫疯如何治疗

转载请注明原文网址:http://www.gzdatangtv.com/bbqb/11660.html

------分隔线----------------------------