没有合适的资源?快使用搜索试试~ 我知道了~
C语言经典问题及代码分析
4星 · 超过85%的资源 需积分: 10 7 下载量 181 浏览量
2013-04-13
21:37:47
上传
评论 8
收藏 2.52MB PDF 举报
温馨提示
试读
290页
C语言经典问题,里面包含一些在一些国内的C语言的书上很少提到的问题,对学习C语言有很大的帮助
资源推荐
资源详情
资源评论
第 1 章 C 语言
本章主要描述 C 语言一些基本要素。当你开始编写 C 程序时,你可能对 C 语言的一些基本问题感到困惑,
如 C 语言所使用的约定、关键字和术语等。本章将回答这方面你经常会遇到的一些问题。
例如,switch 语句是最常用的一种 C 语言构件,本章将回答与它有关的三个常见问题。本章还涉及其它几
个问题,如循环、分支、运算符的优先级和程序块技术。在阅读本章时,请注意有关 switch 语句和运算符优先
级的一些问题,这些问题常常会使 C 语言的初学者感到迷惑。
1.1 什么是局部程序块(local block)?
局部程序块是指一对大括号({})之间的一段 C 语言程序。一个 C 函数包含一对大括号,这对大
括号之间的所有内容都包含在一个局部程序块中。if 语句和 swich 语句也可以包含一对大括号,
每对大括号之间的代码也属于一个局部程序块。此外,你完全可以创建你自己的局部程序块,而
不使用 C 函数或基本的 C 语句。你可以在局部程序块中说明一些变量,这种变量被称为局部变量,
它们只能在局部程序块的开始部分说明,并且只在说明它的局部程序块中有效。如果局部变量与
局部程序块以外的变量重名,则前者优先于后者。下面是一个使用局部程序块的例子:
#include <stdio.h>
void main(void);
void main()
{
/ * Begin local block for function main() * /
int test_ var = 10;
printf("Test variable before the if statement: %d", test_var);
if (test_var>5)
{
/ * Begin local block for "if" statement * /
int test_ var = 5;
printf("Test variable within the if statement: %d",
test_var);
{
/ * Begin independent local block (not tied to
any function or keyword) * /
int test_var = 0;
printf (
"Test variable within the independent local block: %d",
test_var)
}
/ * End independent local block * /
printf ("Test variable after the if statement: %d", test_var);
}
1
/*End local block for function main () * /
上例产生如下输出结果:
Test variable before the if statement: 10
Test variable within the if statement: 5
Test variable within the independent local block:0
Test variable after the if statement: 10
注意,在这个例子中,每次 test_var 被定义时,它都要优先于前面所定义的 test_var 变量。
此外还要注意,当 if 语句的局部程序块结束时,程序重新进入最初定义的 test_var 变量的作用
范围,此时 test_var 的值为 10。
请参见:
1.2 可以把变量保存在局部程序块中吗?
1.2 可以把变量保存在局部程序块中吗?
用局部程序块来保存变量是不常见的,你应该尽量避免这样做,但也有极少数的例外。例如,
为了调试程序,你可能要说明一个全局变量的局部实例,以便在相应的函数体内部进行测试。为
了使程序的某一部分变得更易读,你也可能要使用局部程序块,例如,在接近变量被使用的地方
说明一个变量有时就会使程序变得更易读。然而,编写得较好的程序通常不采用这种方式来说明
变量,你应该尽量避免使用局部程序块来保存变量。
请参见:
1.1 什么是局部程序块?
1.3 什么时候用一条switch语句比用多条if语句更好?
如果你有两个以上基于同一个数字(numeric)型变量的条件表达式,那么最好使用一条
switch 语句。例如,与其使用下述代码:
if (x ==l)
printf ("x is equal to one. \n");
else if (x ==2)
printf ("x is equal to two. \n");
else if (x = =3)
printf ("x is equal to three. \n");
else
printf ("x is not equal to one, two, or three. \n");
不如使用下述代码,它更易于阅读和维护:
switch (x)
{
case 1: printf ("x is equal to one. \n");
break;
2
case 2: printf ("x is equal to two. \n");
break
case 3: printf ('x is equal to three. \n");
break;
default: printf ("x is not equal to one, two, or three. \n");
break;
}
注意,使用 switch 语句的前提是条件表达式必须基于同一个数字型变量。例如,尽管下述
if 语句包含两个以上的条件,但该例不能使用 switch 语句,因为该例基于字符串比较,而不是
数字比较:
char *name="Lupto";
if(!stricmp(name,"Isaac"))
printf("Your name means'Laughter'.\n");
else if(!stricmp(name,"Amy"))
printf("Your name means'Beloved'.\n");
else if(!stricmp(name,"Lloyd"))
printf("Your name means'Mysterious'.\n");
else
printf("I haven't a clue as to what your name means.\n");
请参见:
1.4 switch 语句必须包含 default 分支吗 7
1.5 switch 语句的最后一个分支可以不要 break 语句吗?
1.4 switch语句必须包含default分支吗?
不,但是为了进行错误检查或逻辑检查,还是应该在 switch 语句中加入 default 分支。例如,下述 switch 语
句完全合法:
switch (char_code)
{
case tyt:
case 'y': printf ( " You answered YES ! \n" )
break
case 'N':
case 'n': printf ("You answered NO!\n");
break
}
但是,如果一个未知字符被传递给这条 switch 语句,会出现什么情况呢?这时,程序将没有任何输出。因此,
最好还是加入一个 default 分支,以处理这种情况:
......
default: printf ("Unknown response : %d\n", char_code);
3
break
......
此外,default 分支能给逻辑检查带来很多方便。例如,如果用 switch 语句来处理数目固定的条件,而且认为
这些条件之外的值都属于逻辑错误,那么可以加入一个 default 分支来辨识逻辑错误。请看下列:
void move_cursor (int direction)
{
switch (direction)
{
case UP: cursor_up()
break
case DOWN: cursor_down()
break
case LEFT: cursor_left ()
break
case RIGHT: cursor_ right ( )
break
default: printf ("Logic error on line number %ld!!! \n",
__ LINE__ )
break
}
}
请参见:
1.3 什么时候用一条 switch 语句比用多条 if 语句更好?
1.5 Switch 语句的最后一个分支可以不要 break 语句吗?
1.5 switch语句的最后一个分支可以不要break语句吗?
尽管 switch 语句的最后一个分支不一定需要 break 语句,但最好还是在 switch 语句的每个
分支后面加上 break 语句,包括最后一个分支。这样做的主要原因是:你的程序很可能要让另一
个人来维护,他可能要增加一些新的分支,但没有注意到最后一个分支没有 break 语句,结果使
原来的最后一个分支受到其后新增分支的干扰而失效。在每个分支后面加上 break 语句将防止发
生这种错误并增强程序的安全性。此外,目前大多数优化编译程序都会忽略最后一条 break 语句,
所以加入这条语句不会影响程序的性能。
请参见:
1. 3 什么时候用一条 switch 语句比用多条 if 语句更好?
1. 4 switch 语句必须包含 default 分支吗?
1.6
除了在for语句中之外,在哪些情况下还要使用逗号运算符?
逗号运算符通常用来分隔变量说明、函数参数、表达式以及 for 语句中的元素。下例给出了使用
逗号的多种方式:
#include <stdio.h>
4
#include <stdlib.h>
void main(void);
void main ()
{
/ * Here, the comma operator is used to separate three variable declarations. * /
int i, j, k;
/ * Notice how you can use the comma operator to perform
multiple initializations on the same line. * /
i=0, j=1, k=2;
printf("i= %d, j=%d, k= %d\n", i, j, k);
/ * Here, the comma operator is used to execute three expressions
in one line: assign k to i, increment j, and increment k.
The value that i receives is always the rigbtmost expression.* /
i= ( j++, k++ );
printf("i=%d, j=%d, k=%d\n", i, j, k);
/ * Here, the while statement uses the comma operator to assign the value of i as well
as test it. * /
while (i=(rand() % 100), i !=50)/*随即数*/
printf("i is %d, trying again... \n", i)
printf ("\nGuess what? i is 50!\n" )
}
请注意下述语句:
i:(j++,k++)
这条语句一次完成了三个动作,依次为:
(1)把 k 值赋给 i。这是因为左值(lvaule)总是等于最右边的参数,本例的左值等于 k。注意,
本例的左值不等于 k++,因为 k++是一个后缀自增表达式,在把 k 值赋给 j 之后 k 才会自增。如果
所用的表达式是++k,则++k 的值会被赋给 i,因为++k 是一个前缀自增表达式,k 的自增发生在赋
值操作之前。
(2)j 自增。
(3)k 自增。
此外,还要注意看上去有点奇怪的 while 语句:
while (i=(rand() % 100), i !=50)
printf("i is %d, trying again... \n");
这里,逗号运算符将两个表达式隔开,while 语句的每次循环都将计算这两个表达式的值。逗
号左边是第一个表达式,它把0至99之间的一个随机数赋给 i;第二个表达式在 while 语句中更
常见,它是一个条件表达式,用来判断 i 是否不等于 50。while 语句每一次循环都要赋予 i 一个
新的随机数,并且检查其值是否不等于 50。最后,i 将被随机地赋值为 50,而 while 语句也将结
束循环。
请参见:
1.12 运算符的优先级总能保证是“自左至右”或“自右至左”的顺序吗?
1.13 ++var 和 var++有什么区别?
5
剩余289页未读,继续阅读
资源评论
- 原子小金刚2014-06-03很不错的书,给我不少帮助!
jueying10000
- 粉丝: 4
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功