C语言百问
c语言编程题库100题

c语言编程题库100题1. 计算两个整数的和编写一个C程序,接收两个整数作为输入并计算它们的和,并将结果输出。
2. 计算两个整数的差编写一个C程序,接收两个整数作为输入并计算它们的差,并将结果输出。
3. 计算两个整数的乘积编写一个C程序,接收两个整数作为输入并计算它们的乘积,并将结果输出。
4. 计算两个整数的商编写一个C程序,接收两个整数作为输入并计算它们的商,并将结果输出。
5. 判断一个整数是否为偶数编写一个C程序,接收一个整数作为输入并判断它是否为偶数,并将结果输出。
6. 判断一个整数是否为质数编写一个C程序,接收一个整数作为输入并判断它是否为质数(只能被1和自身整除的数),并将结果输出。
7. 计算一个整数的阶乘编写一个C程序,接收一个整数作为输入并计算它的阶乘,并将结果输出。
8. 计算一个整数的平方根编写一个C程序,接收一个整数作为输入并计算它的平方根,并将结果输出。
9. 判断一个字符串是否为回文字符串编写一个C程序,接收一个字符串作为输入并判断它是否为回文字符串(正向和反向读取都相同的字符串),并将结果输出。
10. 排序一个整数数组编写一个C程序,接收一个整数数组作为输入并对其进行排序,并将结果输出。
11. 求两个整数之间的最大公约数编写一个C程序,接收两个整数作为输入并计算它们的最大公约数,并将结果输出。
......(依此类推,共100道题)这是一个C语言编程题库,包含100道不同类型的题目。
你可以选择其中的题目进行练习和实践,通过解决这些问题来提升自己的C语言编程能力。
每道题目都有具体的描述和要求,你可以按照题目要求编写相应的代码,并运行测试。
如果遇到问题,可以参考相关的解法或向他人寻求帮助。
通过不断地练习和学习,你将逐渐掌握C语言的编程技巧和思维方式,提高自己在编程领域中的能力。
祝你编程愉快!。
学习C语言100问

学习C语言100问问题1:什么是分程序(复合语句)?分程序是指一对大括号{}之间的一段C语言程序。
每一个C函数的函数体都是包括在一对大括号中,switch语句所有取值情况的列举也是包括在一对大括号中,以此可以看出分程序在C语言中使用非常广泛,用户也可以根据需要自己组织分程序(更多的是程序功能的需要),它在C程序中的功能相当于一局部程序块,其间可以定义变量,这种变量称为局部变量,只能定义在分程序的开始部分,变量的有效范围是分程序内部。
如果局部变量与分程序以外的变量重名,在本分程序内部,该局部变量对外面的同名变量进行屏蔽,另外提示一点的是,一般不用分程序来保存变量,例如:#include<stdio.h>int test=5;void main(){int test=10;void fun1();/*-----5----*/fun1();printf(“2--%d\n”,test);/*-----10-----*/{int test=15;printf(“3--%d\n”,test);/*-----15-----*/}}void fun1(){printf(“1--%d\n”,test);}问题2:什么情况下用switch语句比if语句的多重嵌套更适合?如果有两个以上基于同一个数字型变量(整型变量,字符型变量,枚举类型变量等)的条件表达式,尤其是对于作为判断的数字型变量的取值很有限,且对每一个不同的取值,其所做的处理也不一样的情况,最好使用一条switch语句,这样更易于阅读各维护。
这里有两点需要注意就是,第一就是用于作为判断条件的变量一定要是数字型的,另一点就是所有的判断条件都是基于同一个数字变量,而不是多个变量。
例如:有如左下的if嵌套更适合用右下的switch语句表达。
char grade;if(grade==’A’)printf(“85~100\n”); else if(grade==’B’)printf(“70~84\n”); else if(grade==’C’)pritnf(“60~69\n”); else if(grade==’D’)printf(“<60\n”); else printf(“error\n”);switch(grade){case‘A’:printf(“85~100\n”);break;case‘B’:printf(“70~84\n”);break;case‘C’:printf(“60~69\n”);break;case‘D’:printf(“<60\n”);break;default:printf(“error”);break;}问题3:switch语句必须包含default分支吗?回答是否定的。
C语言面试问题大全

4. static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域7. 引用与指针有什么区别?1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。
2) 不存在指向空值的引用,但是存在指向空值的指针。
8. 描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈10. 什么是平衡二叉树?左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于111. 堆栈溢出一般是由什么原因导致的?没有回收垃圾资源12. 什么函数不能声明为虚函数?constructor13. 冒泡排序算法的时间复杂度是什么?O(n^2)14. 写出float x 与“零值”比较的if语句。
if(x>0.000001&&x<-0.000001)16. Internet采用哪种网络协议?该协议的主要层次结构?tcp/ip 应用层/传输层/网络层/数据链路层/物理层17. Internet物理地址和IP地址转换采用什么协议?ARP (Address Resolution Protocol)(地址解析協議)18.IP地址的编码分为哪俩部分?IP地址由两部分组成,网络号和主机号。
不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。
2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。
写出C程序。
循环链表,用取余操作做3.不能做switch()的参数类型是:switch的参数不能为实型。
華為1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。
要用全局变量,需要使用"::"局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内2、如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用ex tern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。
c语言面试题目100及最佳答案精选全文

精选全文完整版(可编辑修改)c语言面试题目及最佳答案1、描述⼀下gcc的编译过程?gcc编译过程分为4个阶段:预处理、编译、汇编、链接。
预处理:头⼀件包含、宏替换、条件编译、删除注释编译:主要进⼀词法、语法、语义分析等,检查⼀误后将预处理好的⼀件编译成汇编⼀件。
汇编:将汇编⼀件转换成⼀进制⼀标⼀件链接:将项⼀中的各个⼀进制⼀件+所需的库+启动代码链接成可执⼀⼀件2、内存的最⼀存储单位以及内存的最⼀计量单位分别是?内存的最⼀存储单位为⼀进制位,内存的最⼀计量单位字节3、#include<> 与#include ""的区别?include<>到系统指定⼀录寻找头⼀件,#include ""先到项⼀所在⼀录寻找头⼀件,如果没有找再到系统指定的⼀录下寻找4、描述⼀下变量的命名规则变量名有字⼀、数值、下划线组成,但不能以数值开头5、变量的声明与定义有啥区别?声明变量不需要建⼀存储空间,变量的定义需要建⼀存储空间6、谈谈c语⼀中有符号和⼀符号的区别?有符号:数据的最⼀位为符号位,0表示正数,1表示负数⼀符号:数据的最⼀位不是符号位,⼀是数据的⼀部分7、谈谈计算机中补码的意义统⼀了零的编码将符号位与其他位统⼀处理将减法运算转换成加法运算8、谈谈数组的特点同⼀个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的9、数组的分类数组的分类主要是:静态数组、动态数组两类。
静态数组:类似int arr[5];在程序运⼀就确定了数组的⼀⼀,运⼀过程不能更改数组的⼀⼀。
动态数组:主要是在堆区申请的空间,数组的⼀⼀是在程序运⼀过程中确定,可以更改数组的⼀⼀。
10、描述⼀下⼀维数组的不初始化、部分初始化、完全初始化的不同点不初始化:如果是局部数组数组元素的内容随机如果是全局数组,数组的元素内容为0 部分初始化:未被初始化的部分⼀动补0完全初始化:如果⼀个数组全部初始化可以省略元素的个数数组的⼀⼀由初始化的个数确定11、谈谈数组名作为类型、作为地址、对数组名取地址的区别?数组名作为类型:代表的是整个数组的⼀⼀数组名作为地址:代表的是数组⼀元素的地址对数组名取地址:代表的是数组的⼀地址12、谈谈你对⼀维数组在物理上以及逻辑上的数组维度理解⼀维数组在逻辑上是⼀维的,在物理上是⼀维的13、描述⼀下函数的定义与函数的声明的区别函数定义:是指对函数功能的确⼀,包括指定函数名、函数类型、形参及其类型、函数体等,它是⼀个完整的、独⼀的函数单位。
c语言面试题目100及最佳答案

c语言面试题目100及最佳答案作为IT行业人士需要掌握的最基本的计算机语言—c语言,如今的地位只高不低,c语言掌握程度的高低往往在面试的时候可以完全表现出来,而有些问题是大家平时似乎是知道的,但却不能完整准确地回答上来的,今天大家带来精心整理的C语言经典面试题,希望对大家有所帮助.1、请填写bool , float, 指针变量与“零值”比较的if语句。
提示:这里“零值”可以是0, 0。
0 , FALSE 或者“空指针”。
例如int 变量n 与“零值”比较的if 语句为:if ( n == 0 )if ( n != 0 )以此类推。
(1)请写出bool flag 与“零值”比较的if 语句:【标准答案】if ( flag ) if ( !flag )100 条经典 C语言笔试题目(2)请写出float x 与“零值"比较的if 语句:【标准答案】 const float EPSINON = 0.00001;if ((x 〉= - EPSINON) &&(x <= EPSINON)不可将浮点变量用“==" 或“!=" 与数字比较,应该设法转化成“〉=”或“〈=”此类形式。
100 条经典 C语言笔试题目(3)请写出char *p 与“零值"比较的if 语句【标准答案】 if (p == NULL) if (p != NULL)2、以下为Linux下的32 位C 程序,请计算sizeof 的值。
char str[] = “Hello”;char *p = str ;i nt n = 10;请计算(1)sizeof (str ) = (2)s i zeof ( p ) = (3)sizeof ( n ) =【标准答案】(1)6、(2)4 、(3 )4(4)void Func ( char str[100]){……;}请计算sizeof( str ) =(5)void * p = mall oc( 100 );请计算sizeof ( p ) =【标准答案】(4)4、(5)44、用变量a 给出下面的定义e) 一个有10个指针的数组,该指针是指向一个整型数的;f) 一个指向有10个整型数数组的指针;g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数;h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;【标准答案】e)int * a[10]; f)int (*a)[10]g)int (*a)(int); h) int (*a[10])(int)5、设有以下说明和定义:typedef u nion {long i; int k[5]; char c;} DATE;struct data { int cat; DATE cow; double dog;} too; DATE max;则语句printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:_____【标准答案】DATE是一个union,变量公用空间。
c语言经典100题菜鸟教程

c语言经典100题菜鸟教程C语言是一种通用且广泛应用的编程语言,学习C语言是许多程序员的第一步。
熟练掌握C语言是提高编程技能的关键之一。
为了帮助菜鸟们更好地学习C语言,本篇文章将介绍C语言经典100题,希望能够帮助大家巩固学习内容,提升编程能力。
1. 请编写一个C程序,输出"Hello, World!"。
```c#include <stdio.h>int main() {printf("Hello, World!");return 0;}```2. 请编写一个C程序,输入两个整数,求它们的和并输出。
```c#include <stdio.h>int main() {int num1, num2, sum;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);sum = num1 + num2;printf("两个整数的和为:%d", sum);return 0;}```3. 请编写一个C程序,输入一个整数,判断该整数是否为奇数并输出。
```c#include <stdio.h>int main() {int num;printf("请输入一个整数:");scanf("%d", &num);if (num % 2 == 0) {printf("%d是偶数", num);} else {printf("%d是奇数", num);}return 0;}```4. 请编写一个C程序,输入一个数字n,计算n的阶乘并输出。
```c#include <stdio.h>int main() {int n, i;unsigned long long factorial = 1;printf("请输入一个整数:");scanf("%d", &n);for (i = 1; i <= n; ++i) {factorial *= i;}printf("%d的阶乘为:%llu", n, factorial);return 0;}```5. 请编写一个C程序,输入一个数字n,输出斐波那契数列中的第n个数。
c语言面试题目100及最佳答案

c语言面试题目100及最佳答案1. 介绍C语言的基本数据类型和其范围。
C语言的基本数据类型有char、int、float和double。
它们的范围分别如下:- char: -128到127- int: -32768到32767- float: 3.4e-38到3.4e+38- double: 1.7e-308到1.7e+3082. 什么是指针(Pointer)?请解释指针的作用。
指针是一个变量,其值为另一个变量的地址。
它的作用是用于在程序中动态地分配内存、传递函数参数和实现复杂数据结构,如链表和树。
3. 请解释C语言中的自动变量和静态变量的区别。
自动变量是在函数内部声明的变量,在函数结束时会被销毁。
而静态变量是在函数内或函数外声明的变量,它的值在函数调用之间保持不变。
4. 解释什么是递归函数?递归函数是一个可以调用自身的函数。
在递归函数中,函数会反复调用自己,直到满足终止条件为止。
5. 请解释C语言中的位运算符。
C语言中的位运算符包括与(&)、或(|)、异或(^)、取反(~)、左移(<<)和右移(>>)运算符。
这些运算符用于对二进制数的位进行操作,常用于位掩码和位操作等场景。
6. 什么是结构体?结构体是一种用户自定义的数据类型,它可以包含不同类型的数据成员。
通过结构体,我们可以将多个不同的变量组合在一起,形成一个逻辑上的整体。
7. 解释C语言中的动态内存分配。
动态内存分配是指在程序运行时根据需要动态地分配内存空间。
C 语言中的动态内存分配函数包括malloc、calloc和realloc,通过这些函数可以在程序运行时根据需求分配或释放内存。
8. 请解释C语言中的头文件和库文件的作用。
头文件包含一组函数声明、宏定义和结构体声明等信息,用于在源文件中引用。
库文件则包含已编译的函数实现和数据,通过链接库文件可以在程序中使用这些函数和数据。
9. 什么是指针数组和数组指针?指针数组是一个数组,每个元素都是指针类型。
c语言基础100题

c语言基础100题以下是c语言基础100题:1. 编写一个程序,打印“Hello, World!”2. 编写一个程序,读取两个整数并打印它们的和。
3. 编写一个程序,读取一个整数并判断它是奇数还是偶数。
4. 编写一个程序,读取一个整数并判断它是否为质数。
5. 编写一个程序,读取一个整数并计算它的阶乘。
6. 编写一个程序,读取一个整数并打印它的逆序。
7. 编写一个程序,读取一个字符串并打印它的长度。
8. 编写一个程序,读取一个字符串并将其反转。
9. 编写一个程序,读取一个字符串并判断它是否为回文。
10. 编写一个程序,读取一个字符串并统计其中的字符、单词和行数。
11. 编写一个程序,读取一个字符串并将其中的小写字母转换为大写字母。
12. 编写一个程序,读取一个字符串并将其中的大写字母转换为小写字母。
13. 编写一个程序,读取一个字符串并打印其中每个字符的ASCII码。
14. 编写一个程序,读取一个整数并将其转换为二进制、八进制和十六进制。
15. 编写一个程序,读取两个整数并交换它们的值。
16. 编写一个程序,读取两个整数并计算它们的最大公约数和最小公倍数。
17. 编写一个程序,读取一个整数并打印出它的所有因子。
18. 编写一个程序,生成斐波那契数列的前n项。
19. 编写一个程序,读取一个字符串,并打印其中出现最多的字符。
20. 编写一个程序,读取一个字符串,并将其中的空格替换为连字符。
21. 编写一个程序,读取一个字符串并删除其中的重复字符。
22. 编写一个程序,读取一个字符串并判断它是否为合法的URL。
23. 编写一个程序,读取一个字符串并打印出其中的单词个数。
24. 编写一个程序,读取一个字符串并打印出其中的句子个数。
25. 编写一个程序,读取一个整数n并打印出前n个自然数的平方。
26. 编写一个程序,读取一个整数n并打印出前n个自然数的立方。
27. 编写一个程序,读取一个整数n并打印出前n个自然数的和。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学习C语言百问问题1:什么是分程序(复合语句)?分程序是指一对大括号{}之间的一段C语言程序。
每一个C函数的函数体都是包括在一对大括号中,switch语句所有取值情况的列举也是包括在一对大括号中,以此可以看出分程序在C语言中使用非常广泛,用户也可以根据需要自己组织分程序(更多的是程序功能的需要),它在C程序中的功能相当于一局部程序块,其间可以定义变量,这种变量称为局部变量,只能定义在分程序的开始部分,变量的有效范围是分程序内部。
如果局部变量与分程序以外的变量重名,在本分程序内部,该局部变量对外面的同名变量进行屏蔽,另外提示一点的是,一般不用分程序来保存变量,例如:#include <stdio.h>int test=5;void main( ){int test=10;void fun1( );/*-----5----*/fun1( );printf(“2--%d\n”,test);/*-----10-----*/{int test=15;printf(“3--%d\n”,test);/*-----15-----*/}}void fun1( ){printf(“1--%d\n”,test);}问题2:什么情况下用switch语句比if语句的多重嵌套更适合?如果有两个以上基于同一个数字型变量(整型变量,字符型变量,枚举类型变量等)的条件表达式,尤其是对于作为判断的数字型变量的取值很有限,且对每一个不同的取值,其所做的处理也不一样的情况,最好使用一条switch语句,这样更易于阅读各维护。
这里有两点需要注意就是,第一就是用于作为判断条件的变量一定要是数字型的,另一点就是所有的判断条件都是基于同一个数字变量,而不是多个变量。
例如:有如左下的if嵌套更适合用右下的switch语句表达。
char grade;if(grade= =‟A‟) printf(“85~100\n”); else if(grade= =‟B‟) printf(“70~84\n”); else if(grade= =‟C‟) pritnf(“60~69\n”); else if(grade= =‟D‟) printf(“<60\n”); else printf(“error\n”);switch(grade){case …A‟: printf(“85~100\n”);break;case …B‟: printf(“70~84\n”);break;case …C‟: printf(“60~69\n”);break;case …D‟: printf(“<60\n”);break;default: printf(“error”);break;}问题3:switch语句必须包含default分支吗?回答是否定的。
但是为了逻辑上的严密性,一般应写default分支,这样在出现所有的case 子句以外的取值时才不至于难以确定其错误所在,例如象上面的例子,如省略了后面的default子句,而用户如输入的是除…A‟,…B‟,…C‟,…D‟以外的其他字符时,程序不做出任何反应,而这本身是一种非法输入。
问题4:switch语句的最后一个分支可以不要break语句吗?每一个case分支后面是否必须要加break语句?两者的答案都是“不”。
大家知道,在switch 语句中,如果作为条件判断的数字表达式的值与某一个case后面的取值相等,则以该case分支语句作为入口顺序执行后续语句,如遇上break语句,则结束switch语句的处理,转而处理switch语句的后续语句,根据这个道理显然最后一个分支中的break语句可以省略,因为无论是否有break语句,此时都会结束switch 语句的处理。
问题5:怎样判断循环是否提前结束?在多循环条件下,又如何知道是因为哪个条件不满足而使循环提前结束的?解决这种问题通常是在循环语句的后面再用一个或多个判断语句检查循环变量的取值,从而确知循环是正常结束还是提前结束,如循环条件是由多个循环变量构成,则可以对各个变量分别进行判断。
例如:#include <math.h>void isprime(int num){ int s;for(s=2;s<=sqrt(num);s++)if(num % s = =0) flag=0;if(s>sqrt(num)) return(1);else return(0);}以上的例子用于判断给定的数是否为素数,函数中的循环语句正常结束是当s的取值大于给定数的平方根,但只要该数能够被某一个大于1而小于其平方根的数整除,即说明该数不是素数,循环提前结束,于是在循环语句后面加一个判断,以得出正确结果。
问题6:什么叫左子值?数组名为什么不能作为左子值?左子值是指可以被赋值的表达式,即可以出现在赋值符号的左侧的表达式。
同理出现在赋值符号右侧的称为右子值,每一个赋值语句都必须有一个左子值和一个右子值。
左子值必须是内存的一个存储单元(在程序中通常表现为一个变量),而不能是一个常量。
我们知道数组名在C语言中,代表的是数组所分配的存储单元的起始地址,而C语言中数组不可以在程序运行的过程进行移动,也就是说,数组一旦定义,其所占据的存储单元是固定的,也即他的起始地址也是固定不变,所以C语言在的数组名被当作是一个常量,也因此不能作为左子值。
问题7:++var和var++有什么区别?“++”运算符在C语句中的使用可以说多得不能胜数,但是要真正掌握它的运算却也并非易事,尤其是在多个运算符混合使用的情况下更是如此。
“++”有前辍运算(++var)和后辍运算(var++)两种,大家都知道前者在表达式中是先把var加1,而后引用var的值,后者是先引用var的值,而后var加1,但在如下的运用中,就很难用这种规则来解释了:如:int x=10;y=x+++x++;经以上运算y的值是多少呢?答案是20,这里首先要确定各运算符的运算关系,按C语言确定运算符的规则(从左至右取尽量多的字符构成一个运算符),以上表达式相当y=(x++)+(x++),其中有两个后辍运算的自加运算,值得注意的是,引用时先把x的值在整个表达式中使用,而后进行两次加1操作,所以y后来的取值为20,而x 的值为12,不理解的话,很容易得出y的值最后是21的错误结果。
再如:int x=5; printf(“%d,%d\n”,x++,x++);输出的究竟是“5,6”,或“6,5”,还是“5,5”,再或者是其他取值呢?按照一般的思路要得出正确结果还是颇费周折的,正确结果是“6,5”,这里牵涉到C语言实参的求值顺序(自右至左计算各实参表达式)。
问题8:变量存储在内存中的什么地方?变量名是一个符号地址,代表内存中的某个内存单元,那么它究竟存储在什么位置呢?对于一般程序设计人员,并不需要具体知道变量的存储位置,但应该根据变量的存储属性判断变量的存储区域。
第一种是在函数外部定义的变量(全局变量或静态外部变量)和在函数内部定义的static变量,其生存期是程序运行的全过程,这些变量被存储在数据段中。
数据段是在内存中为这些变量留出的一段大小固定的空间。
第二种是在函数内部定义的auto变量(不加关键字static的变量)的生存期从程序开始执行其所在的程序块代码时开始,到程序离开该程序块时为止,即定义该变量的函数的部。
作为函数参数的变量只在调用该函数期间存在。
这些变量被存储在栈中。
栈是内存中的一段空间,开始很小,以后逐渐自动增大,这个界限由系统决定,并且通常非常大,因此程序员不必担心用尽栈空间。
第三种是内存空间实际上并不存储变量,但是可以用来存储变量所指向的数据。
如果把调用malloc()函数的结果赋给一个指针变量,那么这个指针变量将包含一块动态分配的内存的地址,这块内存位于一段名“堆(heap)”的内存空间中。
堆开始时也很小,但当程序员调用malloc()或calloc()等内存分配函数时它就会增大。
堆可以和数据段或栈共用一个内存段,也可以有它自己的内存段,这取决于编译选项和操作系统。
问题9:使用register变量的意义何在?有什么用途?register作名词的本义是“注册,寄存器”的意思,在程序中如果用register修饰定义变量,表示将该变量保存在CPU的寄存器中,显然可以加快访问速度,但也不可以随意使用,而有以下几点限制:第一,register变量必须是能被CPU寄存器所接受的数据类型,如不能把一个组合类型的变量指定为register变量。
第二,因为register变量保存在CPU中,显然不应该用取地址运算符“&”来获取变量的地址。
除去以上的限制外,也并不是说我们尽可能地多地定义register变量就能加快程序的运行速度,毕竟CPU中寄存器是有限的,如果你把变量指定为register变量,意味着可用于别的用途的寄存器就减少了,如程序运算产生的中间结果,它们的应用又很频繁,在寄存器不足的情况下,只好借助于内存,这样反倒会降低程序的运算速度。
在现今的C版本中,大多已没有定义register变量的必要,因为编译程序忽略register修饰符,而根据寄存器的使用情况和变量的情况决定是否把变量解释为register变量。
问题10:浮点数比较是否可靠?众所周知,计算机只能表示离散的数据,而浮点数是连续,任意两个浮点数之间都有无限多个浮点数的存在,所以浮点数是计算机编程中的一个盲点。
由于浮点数很难对付,因此比较一个浮点数和某个值是否相等或不等通常是不好的编程习惯。
但是,判断一个浮点数是否大于或小于某个数就安全多了。
例如:如果你想以较小的步长依次使用一个范围内的数字,你可能编写这样一个程序:#include <stdio.h>main(){ float f;for(f=0.0;f!=70.0&&f<71.0;f+=0.007);printf(“f is now %g\n”,f);}然而,舍入误差可能导致f的值永远不等于70.0,这样,循环会跳过70.0。
加入不等式“f<71.0”变是为了防止在这种情况下程序继续运行很长时间。
一种安全的做法是用不等式“f<71.0”作为条件来终止循环,例如:float f;for(f=0.0;f<71.0;f+=0.007);或事先算出循环次数,然后通过整数进行循环计数:float f;int count=70.0/0.007;for(f=0.0;count-- >0;f+=0.007);问题11:说明一个变量和定义一个变量有什么区别?说明一个变量意味着向一个编译程序描述变量的类型,但并不为变量分配空间。