本帖最后由 dad9 于 2012-7-30 15:30 编辑
发了三次才发出来。我。。。。,为什么论坛的防火墙拦截语 言两个字呢。。
要空格分开才行呢。
我想说。贴代码没语法高亮,而且格式直接没了。(管理求语法高亮)
可能是我编辑的关系吧。
我发在自己的博客里,那边的版本好看一点,
原文链接:http://feiesoftware.blog.163.com/blog/static/203066057201263021935577/
==================================--------------------------华丽分割线------------------------================================
最近在学习C语言,再看一本名字叫做《C程序设计语言》,看到了第1.5.3单词计数,后面的一道题目是编写一个程序,一每一行一个单词的形式输出用户输入的字符。
Ok,作者给出的答案,判断是不是单词的方法就是,是否用空格、制表符、或回车进行 分割,如果有则说明之前的是一个单词,则输出一个换行符来换行。
下面我把代码贴上来:
#include <stdio.h>
#define IN 1
#define OUT 0
main(){
int c, state;
state = OUT;
while((c = getchar()) != EOF){
if (c == '\n' || c == ' ' || c == '\t'){
if (state == IN){
printf("\n");
state = OUT;
}
}else if (state == OUT){
state = IN;
putchar(c);
}else
putchar(c);
}
system("pause");
}
测试界面如下:
就是完成分割字符这样一种功能,
仔细看下代码为什么不把这两句合成一句呢
}else if (state == OUT){
state = IN;
putchar(c);
}else
putchar(c);
这两句其实可以合并成一句的。因为IF语句的执行顺序是这样的、
if(条件1)
语句1
else if(条件2)
语句2
else
语句三
如果条件1成立就执行语句1,然后就跳出判断
如果条件一不成立,就判断条件2是否成立,如果成立九执行条件2
如果条件2 也不能成立就执行语句3
也就是说应该是语句1 或语句2如果执行了就会跳出判断,不会执行到语句3
下面先来看一段IF语句测试代码#include <stdio.h>
main()
{
int a, b;
a = 1;
b = 2;
if (a == 1)
printf("1\n");
else
printf("2\n");
system("pause");
}
执行的结果如下:
OK ,假如改动一下 代码成这个样样子#include <stdio.h>
main()
{
int a, b;
a = 1;
b = 2;
if (a == 1)
if (b == 0)
printf("1\n");
else
printf("2\n");
system("pause");
}
执行结果却是这个样子的:
按照刚才的逻辑,a等于1成立则执行if (b == 0)但是b=0不成立就跳出
但是他没有跳出,反而去执行了不属于他本身的else
当然,这里的不属于是写代码主观的思想,但是编译器就会认为下一个else就是数据嵌套判断里的if的,
而去执行它。
所以分割单词的程序代码最初我是改成这个样子的。
#include <stdio.h>
#define IN 1
#define OUT 0
main(){
int c, state;
state = OUT;
while((c = getchar()) != EOF){
if (c == '\n' || c == ' ' || c == '\t'){
if (state == IN){
printf("\n");
state = OUT;
}
}else
putchar(c);
state = IN;
}
system("pause");
}
我把else if去掉了,因为我认为假如嵌套的IF判断不成功就直接跳出了,但事实却不是我想的那样的。
这里出错的主要原因是因为else语句没有加括号,所以else只执行一条语句,而加上括号则执行括号内语句。
但是这里我要说明的不是加括号与不加括号执行语句数不同,而是要说明if语句如果在嵌套使用的时候,括号省略很有可能内嵌套的IF语句在条件不成立的时候会执行,外IF语句的else。
于是我就修改经过我测试,修改代码把代码改成这样
#include <stdio.h>
#define IN 1
#define OUT 0
main(){
int c, state;
state = OUT;
while((c = getchar()) != EOF){
if (c == '\n' || c == ' ' || c == '\t'){
if (state == IN){
printf("\n");
state = OUT;
}
}else{
putchar(c);
state = IN;
}
}
system("pause");
}
给else加上了个括号
把之前的那个测试程序代码也改一下。<font face="monospace">#include <stdio.h>
main()
{
int a, b;
a = 1;
b = 2;
if (a == 1){
if (b == 0){
printf("1\n");
}
}else{
printf("2\n");
}
system("pause");
}</font>
照代码最初的意图,他本就不应该输出什么东西
总结:C语言的IF的括号加与不加区别很大,IF语句下如果只有一句执行语句就不用加{}括号,多个语句时候就需要加,括号的作用不止用来括住多条语句,也是告诉编译器else 属于哪个IF。
|