入门C语言20问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语句是不是有百害而无一利?
goto语句是C语言中的一个控制程序跳转的语句,很多书上都说要慎用,因为无限制的使用goto语句,可能会造成整个程序的混乱,连程序员自己都会无法判断程序的运行流程。但是,这并不表示使用goto是一个有百害而无一利的事情。事实上,这只是一个程序设计风格的问题,goto本身确实是一个简洁明了的语句,适当的使用其实并无害处,当然,不能在一个程序中过多的使用它,尤其是出现过多嵌套使用的情况,那样就真的会出现有百害而无一利的情况。
通过跳转语句,能更好地理解循环语句的实质:
16 穷举法的基本思想是什么?
传统的数学解题方法通常有列方程、寻找简便算法等,那是因为人脑不能进行大量、高速的运算。在计算机数据处理中,可以通过循环程序让计算机对一个问题的所有的可能情况进行判断,从而得出那些满足问题的约束条件的各种可能情况,这些可能的情况就是实际问题的解。由于计算机的高速度和机器性,能够在程序的控制下自动连续地重复执行相同的处理,因此“穷举法”在程序设计中具有广泛应用。例如“鸡兔同笼”的问题就可以通过穷举法来解决。
17 数组在定义的同时赋初值,是否可以省略数组的大小?
在定义时给数组赋初值,如果是给全部的数组元素都赋了初值,那么可以省略一维数组的大小,若是二维数组则只能省略其第一维的大小,而第二维的大小必须明确指定。如果在定义时只是给部分元素赋了初值,那么数组的大小是不能省略的。例如要定义一个三个元素的一维整型数组,分别赋初值1,2,3,则可如下定义:int a[]={1,2,3};此时省略了数组的大小。但是如果定义的是一个具有四个元素的数组,也赋了三个初值,则应该定义如下:int a[4]={1,2,3},注意,此时的长度不可省略。
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数组里面的字符,只能采用逐个字符输出的形式,而对b数组而言,可采用整个字符串一次性输出的形式,并且输出的字符不会包含‘\0’。
19 什么是局部变量、全局变量?
在一个函数中定义的变量,其作用域仅限于定义它的函数中,在其它的函数不能使用,这种变量称为“局部变量”。
定义在函数之外的变量,其作用域范围为定义该变量的程序位置直到程序的结束,在其它的函数中,既可以使用该变量的值,对变量值的改变也在该变量的全部作用域范围内有效,这种变量称为“全局变量”。
20 如何理解“静态存储类别static”的变量?
在一般情况下,当程序调用一个函数时,将首先执行函数中的变量定义和初始化赋值,然后执行其他的代码。例如,对于以下的函数factorial用于计算参数x的阶乘值:
long factorial(int x)
{long p=1;for(;x>=1;x--) p=p*x;return p;
}
当程序中每次调用函数factorial时,都会定义变量p,并为其赋予初始值1。而在函数执行结束,通过执行return p;语句将p的值传递到系统存储区后,变量p将被系统释放。这种类型的变量也称为“auto存储类别”或“动态存储类别”,即每次调用函数时,都需要重新定义变量,重新为其分配存储空间,因此其存储地址是“动态”的。
如果希望在函数退出后,其中的某些变量的值仍然被保留,以备以后的函数调用继续使用,则应将变量定义为“static存储类别”,即“静态存储类别”。通常是不想定义全局变量,但又希望函数内部局部变量的值不被释放,即可以使用静态存储变量。
http://www.taodudu.cc/news/show-839923.html
相关文章:
- 一文通吃所有整流滤波电路
- 自行车实现无人驾驶,背后究竟有何“天机”?
- 线上课程推荐 | 计算机方向:无人驾驶中的环境感知
- 这届清华学生太难了!C++作业难到上热搜!
- 攻城狮危险:波士顿动力机器狗去福特当工程师了!
- 40+张最全Linux/C/C++思维导图,收藏!
- 当年中国的“四大工学院”,现在都咋样了?
- 酷!GitHub开发者自研火星车,开发教程全面开源
- C++ 基础知识!初学者必看!
- 同样是做技术,为什么 Java 能比 C++ 多赚10万?
- 你不会知道,一个小小电阻也很奇妙!
- 科普漫画 | 沙子如何变成芯片?
- 25条写代码建议,句句真言,值得牢记!
- 他复读才考上三本,如今让华为开出201万年薪(其实还拒绝了360万offer)
- 为什么需要这么多编程语言?
- 为什么PCB板通常是绿色的?
- 都说外国电工布线牛到不行?今天就看看中国电工最强布线!
- 程序员崩溃的40个瞬间!(动图)
- 干货分享:单片机编程学习攻略!
- 来,拆一堆芯片看看!
- 关于CPU的12个硬核干货!
- 为什么要做电路保护,电路保护的意义是什么?
- 单片机 | 3种时钟电路方案对比,你常用哪一种?
- 为什么MCU也要支持AI功能?
- Linux!为何他一人就写出这么强的系统?
- 很火的WiFi6,了解一下
- 嵌入式牛人 | 这些单片机编程思想超硬核
- 超赞!这些 “电子” 艺术品,真绝了!
- 遇到指针别害怕!先把这篇笔记看一遍~
- 国产操作系统要起来,这款Linux是你的菜吗?
入门C语言20问20答相关推荐
- 入门C语言10问10答
1 如何理解变量与常量? 变量与常量相当于数据的可读可写与只读,常量是数据的一种保护机制.在内存分配给程序的内存块中有专门的常量(只读)存储区. 2 整型数据的溢出问题 任何一种数据类型的数据在计算机 ...
- 2022-中医基础-《阴阳 20问与答》
阴阳 20问与答 什么是阴阳学说? 阴阳学说,属于中医古代哲学理论范畴,阴阳的对立统一是天地万物运动变化的根本规律.中医学以阴阳交感.对立.互根.消长.转化及自和规律,认识和说明生命健康和疾病. 什么 ...
- WCF 入门 WCF基础知识问与答
学习WCF已有近两年的时间,其间又翻译了Juval的大作<Programming WCF Services>,我仍然觉得WCF还有更多的内容值得探索与挖掘.学得越多,反而越发觉得自己所知太 ...
- 20小时快速入门go语言视频 - Day1
20小时快速入门go语言视频 - Day1 一.第一个 Go 程序 1.1 入口 1.2 Golang 保留的关键字 1.3 Golang预定义标识符 二.数据类型 2.1 数据类型的作用 2.2 数 ...
- 20小时快速入门go语言视频 - Day5
笔记声明 本人智商较低,好记性不如烂笔头.笔记记录了网上一套Golang免费视频教程的知识点,以供未来自己翻阅查看.不写源视频的名称和网站地址了,免得被说是广告! 20小时快速入门go语言视频 - D ...
- 云应用安全可信认证CAST |测评九问九答宣贯会将于4月20日召开
CAST认证介绍 云应用安全可信认证(Cloud Application Security Trust ),简称"CAST认证".由"国际云安全联盟CSA大中华区&quo ...
- c语言计算输入20个有符号整数,统计正整数,零,负整数的个数.操作,输入20个有符号整数,统计正整数.零.负整数的个数.并分别计算之和...
输入10个整数,统计并输出其中正数.负数和零的个数. 如果觉得好,#includevoidmain(){inta[10],i;intpositive_num,negative_num,zero_num ...
- 《C++游戏编程入门(第4版)》——1.10 问与答
本节书摘来自异步社区出版社<C++游戏编程入门(第4版)>一书中的第1章,第1.10节,作者:[美]Michael Dawson(道森),更多章节内容可以访问云栖社区"异步社区& ...
- 问题是:有一只奶牛,出生后第四年成熟,成熟后每年生一只奶牛,问20年后有多少只奶牛?
今晚逛CSDN的问答区的时候看到一个很有趣的问题.问题是:有一只奶牛,出生后第四年成熟,成熟后每年生一只奶牛,问20年后有多少只奶牛? 不考虑生老病死,不考虑生公牛. 附上源码: nainius = ...
最新文章
- 把XML文件转换为字符串
- AsyncQueryHandler了解
- ROS系统 参数的获取和设置
- Linux下监控磁盘io,如何在Linux下监控磁盘IO?
- MySQL slave_exec_mode 参数说明
- tf报错之raise TypeError(“pred must not be a Python bool“)
- Shape Number (最小表示法)
- linux中查看路由命令是什么,linux下查看路由的命令
- WSS2.0 SP2升级到WSS3.0步骤
- access中判断回文的代码_前端也来点算法(TypeScript版) | 2 - 回文数和回文链表
- r语言dataellipse_R语言绘图:28个实用程序包
- python函数手册中文,python函数中文手册.doc
- 服务器,路由器,交换机产品解读
- ExeScope辅助测试工具简介
- Brother DCP-1608 Printer共享打印机防坑指南
- xshell 4 中文乱码问题解决
- apa引用要在文中吗_APA、MLA格式引用规范
- C Primer Plus(6) 中文版 第11章 字符串和字符串函数 11.1 表示字符串和字符串I/O
- 使用scrcpy开源进行电脑usb控制安卓手机,简单方便
- css使用rgb属性设置颜色
热门文章
- 一步步把一个SpringBoot应用打包成Docker镜像并运行
- SAP FSM 学习笔记(三) 在微信里发起SAP FSM客户预约
- Backend cache is always enabled
- SAP Fiori ButtonRenderer
- UI5 Control lazy load mechanism
- nodejs库express是如何接收inbound json请求的
- Cloud for Customer UI toolbar里按钮的渲染逻辑
- Cloud for Customer的mobile setting前台实现
- SAP Cloud for Customer和微信小程序的集成-原型开发示意图
- 海洋工程-专业名词-学科关键词(终极版)