dad9 发表于 2012-7-30 15:19

C语 言IF的括号加与不加

本帖最后由 dad9 于 2012-7-30 15:30 编辑

发了三次才发出来。我。。。。{:301_972:},为什么论坛的防火墙拦截语言两个字呢。。

要空格分开才行呢。{:301_973:}

我想说。贴代码没语法高亮,而且格式直接没了。(管理求语法高亮){:301_983:}

可能是我编辑的关系吧。

我发在自己的博客里,那边的版本好看一点,{:301_1003:}

原文链接: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。











xuliang 发表于 2012-7-30 15:28

发成功了吧,呵呵就是敏感词语的原因啊!

a13005746827 发表于 2012-7-30 15:30

成功发布了吗.

jnad 发表于 2012-7-30 15:32

代码写的要有质量
像if 这种逻辑判断的 最好不要 有神马奇葩的想法
任何语言都一样
if(swich){code 1} else{ code 2}
最后都是按照这种模式写 ,要不然不光是可读性差 , 有时候会因为这一个括号 纠结很长时间的

还有 c编译器 经过测试 不加括号不会增加执行效率

dad9 发表于 2012-7-30 15:36

jnad 发表于 2012-7-30 15:32 static/image/common/back.gif
代码写的要有质量
像if 这种逻辑判断的 最好不要 有神马奇葩的想法
任何语言都一样


《C程序设计语言》作者这样写的。。我曾经去知道发帖子问为什么不加括号呢。
http://zhidao.baidu.com/question/455476665.html
总之。。这可能是他不好的地方吧。误导人。

jnad 发表于 2012-7-30 15:39

dad9 发表于 2012-7-30 15:36 static/image/common/back.gif
《C程序设计语言》作者这样写的。。我曾经去知道发帖子问为什么不加括号呢。
http://zhidao.baidu.com/q ...

额, 我的意思是 像这种逻辑判断后的代码最好都加上{} 让他变成代码块 这样可读性 会提高有时候出错找不出来就是因为他

a13005746827 发表于 2012-7-30 15:41

语法高亮。直接截图出来不就行了吗。

dad9 发表于 2012-7-30 15:45

a13005746827 发表于 2012-7-30 15:41 static/image/common/back.gif
语法高亮。直接截图出来不就行了吗。

{:301_983:}多麻烦。。而且截图别人都没法复制呢

dad9 发表于 2012-7-30 15:46

jnad 发表于 2012-7-30 15:39 static/image/common/back.gif
额, 我的意思是 像这种逻辑判断后的代码最好都加上{} 让他变成代码块 这样可读性 会提高有时候出错找不 ...

嗯,是呀。。我为了这个括号纠结了一个下午了{:1_921:}

a13005746827 发表于 2012-7-30 15:54

C语言IF的括号加与不加

本帖最后由 a13005746827 于 2012-7-30 15:55 编辑

C语言-----为了测试你所遇到的苦难。。。

没有屏蔽语言这两个字啊

C语言c语言

大小写都上了。
页: [1] 2
查看完整版本: C语 言IF的括号加与不加