吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6295|回复: 12
收起左侧

[其他转载] C语 言IF的括号加与不加

 关闭 [复制链接]
dad9 发表于 2012-7-30 15:19
本帖最后由 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");
}
测试界面如下:
1.gif

2.gif

就是完成分割字符这样一种功能,
仔细看下代码为什么不把这两句合成一句呢
  }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");
}
执行的结果如下:

3.gif

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");
}
执行结果却是这个样子的:

4.gif

按照刚才的逻辑,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判断不成功就直接跳出了,但事实却不是我想的那样的。

5.gif
这里出错的主要原因是因为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加上了个括号
6.gif
把之前的那个测试程序代码也改一下。
<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>
7.gif
照代码最初的意图,他本就不应该输出什么东西


总结: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
代码写的要有质量
像if 这种逻辑判断的 最好不要 有神马奇葩的想法
任何语言都一样

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

额, 我的意思是 像这种逻辑判断后的代码最好都加上{} 让他变成代码块 这样可读性 会提高  有时候出错找不出来就是因为他
a13005746827 发表于 2012-7-30 15:41
语法高亮。直接截图出来不就行了吗。
 楼主| dad9 发表于 2012-7-30 15:45
a13005746827 发表于 2012-7-30 15:41
语法高亮。直接截图出来不就行了吗。

多麻烦。。而且截图别人都没法复制呢
 楼主| dad9 发表于 2012-7-30 15:46
jnad 发表于 2012-7-30 15:39
额, 我的意思是 像这种逻辑判断后的代码最好都加上{} 让他变成代码块 这样可读性 会提高  有时候出错找不 ...

嗯,是呀。。我为了这个括号纠结了一个下午了
a13005746827 发表于 2012-7-30 15:54

C语言IF的括号加与不加

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

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

没有屏蔽语言这两个字啊

C语言  c语言

大小写都上了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-9-21 15:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表