⼊门C语⾔20问20答
是新朋友吗?记得先点蓝字关注我哦~
今⽇课程菜单
Java全栈开发 | Web前端+H5
⼤数据开发 | 数据分析
⼈⼯智能+Python | ⼈⼯智能+物联⽹
我:  解锁⾼薪⼯作  免费获取⼲货教程
C语⾔⼀经出现就以其功能丰富、表达能⼒强、灵活⽅便、应⽤⾯⼴等特点迅速在全世界普及和推⼴。C语⾔不但执⾏效率⾼⽽且可移植性好,可以⽤来开发应⽤软件、驱动、操作系统等。C语⾔也是其它众多⾼级语⾔的⿐祖语⾔,所以说学习C语⾔是进⼊编程世界的必修课。
本⽂总结了C语⾔⼊门20个问答,你都知道吗?
1. 源程序的编译及链接是怎样⼀个过程?
2. 编写第⼀个简单的C语⾔程序
3. C语⾔是强类型的语⾔,这是什么意思?
任何程序都要处理数据,计算机可以处理的数据有多种类型。在C语⾔程序中,⽤来保存数据的变量必须事先定义才能在程序中使⽤。
定义变量的语法如下:
变量类型名变量名表;
例如,以下语句定义了x、y、z三个变量名,其值只能取整型值:
int x,y,z;
在C程序中,每⼀个变量都必须声明其取值类型。因此,C语⾔是⼀种强类型的程序设计语⾔。
对于程序中使⽤到的常量、变量的类型要事先进⾏定义才能使⽤,这是保证程序可靠性的⼿段之⼀。早期的⼀些计算机程序设计语⾔不要求对变量的类型进⾏定义,因此,⼀个变量的类型在程序运⾏期间是不确定的,这将会降低程序的可靠性。
4. 如何理解变量与常量?
变量与常量相当于数据的可读可写与只读,常量是数据的⼀种保护机制。在内存分配给程序的内存块中有专门的常量(只读)存储区。
5. 如何正确理解和使⽤赋值运算符?
赋值运算符“=”连接的是左边的变量和右边的表达式,把表达式的值赋值给左边的变量。赋值运算符的优先级⽐较低,只在逗号运算符之前。
⼀个赋值表达式中可以包含多个赋值表达式,赋值表达式的值就等于左边变量的值,在不加圆括号的情况下,赋值运算符按“从右⾄左”的结合顺序运算。由于赋值运算符的优先级⽐较低,如果出现在其他表达式中需要优先运算,则要加圆括号。
赋值运算符“=”连接的是左边的变量和右边的表达式,当变量和表达式的数据类型不⼀致时,会产⽣什么样的结果?C语⾔赋予了赋值表达式类型转换的功能,⼀旦出现变量和表达式的数据类型不⼀致的情况,会⾃动进⾏类型的转换,将表达式的值向变量类型的⽅向进⾏转换。当然,也不是所有不匹配的类型都可以转换,类型转换有⼀定的前提,必须是相近的、可以转换的类型才能进⾏转换。
近的、可以转换的类型才能进⾏转换。
6. 为什么表达式1/2的值为0?
在以下的代码段中,变量x的值为0:
float x;
x=1/2;
变量x虽然被定义为单精度浮点型,但以上代码执⾏后,x的取值为0,⽽不是0.5。这是因为在计算表达式1/2时,由于1和2都是整型常量,计算的结果就只能取整数部分,故为0。
为了防⽌这种情况出现,可以使⽤以下两种⽅法:
(1)使⽤1.0表⽰被除数是⼀个浮点型数据,即x=1.0/2。
(2)使⽤强制类型转换,即(float)1/2。强制类型转换是使⽤显式表达将⼀种数据类型转换为另⼀种数据类型,其格式为:
(类型名)表达式
7. 字符型数据与整型数据、浮点型数据为什么可以直接运算?
字符型数据⽤于表⽰ASCII字符。由于ASCII字符在内存中是以ASCII编码的形式存储的,因此可以将字符型数据看作⼀个整数与整型数据、浮点型数据直接进⾏算术运算,⽽这在其他的计算机语⾔中是不允许的。例如以下的代码段:
int x=32;
char y=’A’;
int z=y+x;
以上代码执⾏后,变量z的值为97。
8. 如何理解逗号运算符和逗号表达式?
逗号表达式是C语⾔中特有的⼀种运算符。在C语⾔的所有运算符中,逗号运算的优先级最低。逗号运算符使⽤逗号将多个表达式连接起来,按照从左到右的顺序依次计算其中的各个表达式的值,整个逗号表达式的值是最右端即最后计算的表达式的值。逗号表达式常⽤于在⼀条语句中连续完成多个计算或操作。例如,t=x;x=y;y=t;将会被作为三条语句处理,⽽t=x,x=y,y=t;则将被当作是⼀条语句处理。由于逗号运算符是C语⾔中优先级最低的运算符,当表达式中含有逗号运算符时,应特别注意运算符的优先级顺序。例如:
int x=3,y;
y=1,x++
执⾏后x=4,y=1。⽽:
int x=3,y;
y=(1,x++);
执⾏后,y=3,x=4。
9. 整型数据的溢出问题
任何⼀种数据类型的数据在计算机中都有它确定的数值表⽰范围,⼀旦超出这个范围,就会产⽣溢出问题。
10. 对于浮点型数据执⾏相等⽐较为什么有时会出现问题?
在C语⾔中,只有整型数据和字符型数据是精确表⽰的。浮点型数据采⽤的是指数表⽰形式,数据的有效位数是有限的,因此浮点型数据是不精确的。对于浮点型数据进⾏相等⽐较时,有时两个相等的数进⾏⽐较也有可能出现不相等的情况。
为了解决浮点数相等⽐较时的误差问题,可以规定当两个数相减之后的绝对值⼩于⼀个⾜够⼩的数时即认为它们相等。
11. 没有初始化的变量的初始值是什么?
如果该变量是静态存储类型的变量,系统编译时会⾃动地赋初值0(对数值型变量)、空字符(对字符变量)、或者空指针(对指针型变量);⽽如果变量是动态存储类型,则在没有赋初值的情况下,将会有⼀个不确定的值(垃圾值,单元格使⽤过后遗留下的历史值)充当其初值,这是⾮常危险的,尤其是对于⼀个不确定的指针来说,修改它所指向存储单元的值可能会造成巨⼤危害。因此,⼀般都要求程序员为变量赋予合理的初值。
12. C语⾔中逻辑值1和0是如何判断的?
C语⾔中,⼀般在进⾏逻辑运算时,将所有⾮零值都作为1,也就是逻辑真;⽽只有本⾝为0的值才当做0,也就是逻辑假参加判断。
13. 求解逻辑表达式时“有解即停”(短路求值)是什么意思?
当需要判断多个条件同时成⽴或⾄少有⼀个成⽴时,需要使⽤逻辑运算符&&和||。表达式A && B表⽰当A与B均为真时,条件为真;表达式A || B表⽰当A与B⾄少⼀个为真时,条件为真。
当求解 A && B时,只要A为假则整个表达式⼀定为假,此时不需要求解表达式B。⽽对于表达式 A || B,只要表达式A为真,则整个表达式⼀定为真,此时不需要求解表达式B。
14. switch语句是如何执⾏的?
C语⾔中的switch语句⽤于处理多分⽀的判断问题。
在switch语句中的多种分⽀情况中,只要到了⼀个与表达式值匹配的case分⽀,则从此位置开始顺序执⾏,除⾮遇到break语句或switch语句结束。
当没有任何⼀个case与表达式的值相匹配时,则执⾏default分⽀中的语句,但这并不意味default分⽀必须位于switch语句的所有case分⽀之后,⽽是可以位于switch语句中的任何位置。同样,如果在default分⽀中没有break语句,则程序仍将顺序执⾏。
在switch语句中,case只是⼀个语句标号,它并不进⾏条件判断。因此,在switch语句执⾏时,会根据switch后⾯表达式的值到匹配的⼊⼝标号,然后从这个标号(也就是向对应的case)处开始执⾏下去,不会再进⾏条件判断。
15. 在C程序中使⽤goto语句是不是有百害⽽⽆⼀利?
15. 在C程序中使⽤goto语句是不是有百害⽽⽆⼀利?
goto语句是C语⾔中的⼀个控制程序跳转的语句,很多书上都说要慎⽤,因为⽆限制的使⽤goto语句,可能会造成整个程序的混乱,连程序员⾃⼰都会⽆法判断程序的运⾏流程。但是,这并不表⽰使⽤goto是⼀个有百害⽽⽆⼀利的事情。事实上,这只是⼀个程序设计风格的问题,goto本⾝确实是⼀个简洁明了的语句,适当的使⽤其实并⽆害处,当然,不能在⼀个程序中过多的使⽤它,尤其是出现过多嵌套使⽤的情况,那样就真的会出现有百害⽽⽆⼀利的情况。
通过跳转语句,能更好地理解循环语句的实质:
16. 穷举法的基本思想是什么?
传统的数学解题⽅法通常有列⽅程、寻简便算法等,那是因为⼈脑不能进⾏⼤量、⾼速的运算。在计算机数据处理中,可以通过循环程序让计算机对⼀个问题的所有的可能情况进⾏判断,从⽽得出那
些满⾜问题的约束条件的各种可能情况,这些可能的情况就是实际问题的解。由于计算机的⾼速度和机器性,能够在程序的控制下⾃动连续地重复执⾏相同的处理,因此“穷举法”在程序设计中具有⼴泛应⽤。例如“鸡兔同笼”的问题就可以通过穷举法来解决。
17. 数组在定义的同时赋初值,是否可以省略数组的⼤⼩?
在定义时给数组赋初值,如果是给全部的数组元素都赋了初值,那么可以省略⼀维数组的⼤⼩,若是⼆维数组则只能省略其第⼀维的⼤⼩,⽽第⼆维的⼤⼩必须明确指定。如果在定义时只是给部分元素赋了初值,那么数组的⼤⼩是不能省略的。例如要定义⼀个三个元素的⼀维整型数组,分别赋初值1,2,3,则可如下定义:int a[]={1,2,3};此时省略了数组的⼤⼩。但是如果定义的是⼀个具有四个元素的数组,也赋了三个初值,则应该定义如下:int a[4]={1,2,3},注意,此时的长度不可省略。
c语言中逗号表达式的用法18. 字符数组与字符串是否等价?
不等价。在C语⾔中,字符串都是作为字符数组来处理的,但是字符串都必须以‘0’作为结束符号,⽽普通的字符数组却没有这个要求。当采⽤字符串对字符数组赋值时,其占⽤的存储空间也有差异。假设有如下定义形式:
char a[]=
{‘h’,’e’,’l’,’l’,’o’};
char b[]={“hello”};
虽然字符数组a和b都是包含了hello⼏个字符,但是a数组是采⽤单个字符赋值的⽅式,⽽b数组是采⽤字符串的形式赋值。那么,a数组只需要有5个字节的⼤⼩即可,⽽b数组则需要6个字节,因为在b数组中,系统会在字符串的末尾⾃动加上⼀个结束标志‘0’。对上⾯两种情况的数组,其输出形式也有不同。如果要输出a数组⾥⾯的字符,只能采⽤逐

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。