C 语言新手 , 练习代码求指导 . 用 if 用乱了 . - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题复制粘贴 AI 生成的内容
GPU
V2EX    程序员

C 语言新手 , 练习代码求指导 . 用 if 用乱了 .

  •  
  •   GPU 2014-07-29 22:55:07 +08:00 6719 次点击
    这是一个创建于 4093 天前的主题,其中的信息可能已经有所发展或是发生改变。
    https://gist.github.com/p0w3r-/e518ff71c6a9d68c3981

    这是代码 .

    搞来搞去 编译不出来 .并且看不懂编译出错后返回的英文.
    第 1 条附言    2014-07-29 23:41:57 +08:00
    经过了10多分钟的挣扎我写出来这个了 . 你们继续喷吧 , 我承受得了 不怕


    .js
    第 2 条附言    2014-07-30 11:08:23 +08:00
    早上又学习了一下 ,知道了switch/case 了.
    但是不知道为什么 讲解的说 要把那个判断的数除10 变成个位数再去判断 ,而不直接用100,90,80,这样子去判断的呢 ?

    我自己试过直接用 100,90,80 这样的数去编译运行也是什么任何问题的啊.



    81 条回复    2014-07-31 13:58:19 +08:00
    yangqi
        1
    yangqi  
       2014-07-29 22:58:28 +08:00
    ....
    无语了, if后面只能有一个else, 之前的用else if
    sy1989
        2
    sy1989  
       2014-07-29 22:59:18 +08:00
    不用else if的话后面应该是一个包一个的
    lightening
        3
    lightening  
       2014-07-29 22:59:39 +08:00
    90 < result >= 80
    leavic
        4
    leavic  
       2014-07-29 22:59:46 +08:00
    哥,能买本教材不?
    GPU
        5
    GPU  
    OP
       2014-07-29 23:00:36 +08:00
    @yangqi 我不是都括起来 .重新 if了吗?
    yukirock
        6
    yukirock  
       2014-07-29 23:01:29 +08:00 via iPhone
    if (cond 1) {
    } else if (cond 2) {
    }

    注意花括号的位置。

    另外 int main() 需要返回 0。
    /td>
    bombless
        7
    bombless  
       2014-07-29 23:01:46 +08:00
    看不懂提示至少能看懂行号吧…
    GPU
        8
    GPU  
    OP
       2014-07-29 23:02:02 +08:00
    @leavic 我有TCPL . 估计看多了就傻了 .然后估计脑子抽了.
    @lightening 哈哈 . 我承认我是乱来的.
    iyaozhen
        9
    iyaozhen  
       2014-07-29 23:03:38 +08:00
    90 < result >= 80,不能这样用啊,不要想当然。还是4楼说的好,借本教材吧。
    GPU
        10
    GPU  
    OP
       2014-07-29 23:04:59 +08:00
    @iyaozhen 有 The C Programming Language .
    @bombless 还不是很懂 if else 的 花括号的运用啊
    iyaozhen
        11
    iyaozhen  
       2014-07-29 23:09:13 +08:00
    @GPU 不应该是 result > 90 && result >= 80 吗?
    tjmao
        12
    tjmao  
       2014-07-29 23:09:19 +08:00
    哥,能买本正规教材不?判断大小的表达式,如果区间的两边是有理数,你要拆成两个表达式中间用逻辑运算符连接起来的。

    我照着词法分析器和语法分析器画三天瓢就知道怎么写代码了……
    tjmao
        13
    tjmao  
       2014-07-29 23:13:16 +08:00
    另外你这算法太烂,result/10, select...case就能完成的事情,写那么多表达式。第一个还写错了,运算符应该是>=。
    yangqi
        14
    yangqi  
       2014-07-29 23:15:14 +08:00
    @tjmao 人家syntax都没弄明白, 就别提算法了吧
    Tinet
        15
    Tinet  
       2014-07-29 23:18:28 +08:00
    大家就不要喷了
    ifconfig
        16
    ifconfig  
       2014-07-29 23:19:09 +08:00
    楼上不要太打击人,咱初中学C的时候还不是对着书一行行敲的,楼主多看书多动手就是了
    icylogic
        17
    icylogic  
       2014-07-29 23:19:53 +08:00
    看不懂英文请用正版中文vs, 免费版express已足够.

    GPU
        18
    GPU  
    OP
       2014-07-29 23:20:21 +08:00
    我一共就学习C的时间就不够两个星期 。 别怪我啊。
    GPU
        19
    GPU  
    OP
       2014-07-29 23:21:05 +08:00
    @icylogic 请问ubuntu 的gcc 编译器有没有中文版 ?
    GPU
        20
    GPU  
    OP
       2014-07-29 23:21:38 +08:00
    @ifconfig 谢谢鼓励啊。 好感动。 终于有一个不喷的
    tonyluj
        21
    tonyluj  
       2014-07-29 23:23:53 +08:00
    BTW:看到LZ每行都有花括号,突然有Go的感觉
    GPU
        22
    GPU  
    OP
       2014-07-29 23:25:09 +08:00
    @tonyluj 我想先学习研究一下C 。然后再去玩玩Go
    RHFS
        23
    RHFS  
       2014-07-29 23:28:59 +08:00
    90 < result >= 80

    90 < result && result > 80 && result = 80
    才对吧,然后别看谭浩强的书。
    icylogic
        24
    icylogic  
       2014-07-29 23:36:32 +08:00
    @GPU

    ...目测没有. 既然用 linux, 那就做好一切自力更生, 并且初期花费一半以上的时间熟悉工具的思想准备, 否则穷温富麦.
    GPU
        25
    GPU  
    OP
       2014-07-29 23:44:30 +08:00
    @icylogic 我会慢慢习惯 linux的 GCC的. 谢了

    @RHFS 我没有看过谭浩强的,也不知道他的书是什么样子 . 只是可能自己不知道从哪里冒出来的想法,然后这样子写了下去.
    GPU
        26
    GPU  
    OP
       2014-07-29 23:46:28 +08:00
    @Livid

    https://gist.github.com/p0w3r-/e518ff71c6a9d68c3981

    看上面我这个链接 , 用户ID 包括了 ” - " 这个符号会导致无法成功把代码发出来 ,算不算bug呢?
    acros
        27
    acros  
       2014-07-29 23:53:35 +08:00
    想起我当年自学C++一个Hello World近十个error的年代,吓尿了
    zhujinliang
        28
    zhujinliang  
       2014-07-30 00:01:49 +08:00 via Android
    result < 90这个条件是没意义的,上面是result>= 90,不成立了,则进行else if条件的判断,已隐含此时值<90,同理后面的<80 <70
    rentaro
        29
    rentaro  
       2014-07-30 00:06:18 +08:00
    return 0;
    jetbillwin
        30
    jetbillwin  
       2014-07-30 00:28:08 +08:00
    我觉得要好好看看出错的信息,哪怕是英文的,配合着字典也能看懂的。现在的编译器都非常智能,基本上都能找到出错点,尤其是LLVM。所以,看懂编译器的出错信息非常有用。
    GPU
        31
    GPU  
    OP
       2014-07-30 00:48:55 +08:00
    @acros 怎么样能弄得十个error 出来 不解啊。
    @rentaro 编辑器居然也没有报错哦。
    @zhujinliang 谢谢提点 。
    rentaro
        32
    rentaro  
       2014-07-30 01:07:43 +08:00
    @GPU 什么开发环境,gcc中return语句后不加分号一定是会报错的,最好贴一下编译的信息。
    Ricepig
        33
    Ricepig  
       2014-07-30 01:14:36 +08:00
    int main()
    {
    int result;

    scanf("%d",&result);
    int rank = 9 - result/10;
    if(rank < 0) {
    rank = 0;
    }else if(rank > 4){
    rank = 4;
    }

    printf("%c/n", 'A'+rank);
    return 0
    }

    这样行吗?
    jesse_luo
        34
    jesse_luo  
       2014-07-30 01:16:03 +08:00
    lz期末考应该已经过了吧……

    另外else if里貌似有一半不用写
    crab
        35
    crab  
       2014-07-30 01:19:56 +08:00
    @tjmao 谁都是从不懂到懂。你这么强,可以去weibo和袁哥试试。
    tioover
        36
    tioover  
       2014-07-30 01:23:04 +08:00
    最近在用模式匹配,简化这些代码非常爽
    em70
        37
    em70  
       2014-07-30 01:47:17 +08:00 via Android
    编译错误看不懂不要紧,可以直接贴google搜索,解决方案马上就出来了,多几次就看懂了。

    另外,程序员英语不需要多好,但至少有查字典阅读的程度
    tjmao
        38
    tjmao  
       2014-07-30 03:37:18 +08:00 via iPhone
    @crab 对,谁都是从不懂到懂。如果我的回复中存在疏漏和错误,也请指出。比如你可以写:select/case还不如查表法快。我将接受这样的批评。

    谢谢。
    abscon
        39
    abscon  
       2014-07-30 06:22:42 +08:00 via Android
    附言1里的代码,if语句中所有的&&后面的判断是否小于的部分都是多余的,可以删掉。

    你的失误在于把if else看成一堆状态的并行的**罗列**,而不是一个串行的**过程**。比如说,当你来到第一个else if的时候,result一定是<90的,否则就掉进前面那个if分支了。

    秀个当年我同学的经典错误的简化版:变更字符串里的字母A的大小写状态,a换成A,A换成a。他是这么写的--
    if( ch == 'a' ) ch = 'A';
    if( ch == 'A' ) ch = 'a';
    bombless
        40
    bombless  
       2014-07-30 08:44:41 +08:00
    一开始是这样的…照着书来看一下表达式是怎么构成的吧,初学的时候不要想当然。
    acros
        41
    acros  
       2014-07-30 08:56:40 +08:00
    @acros
    namespace前面忘了写std;缺少封号;大小写不对;夹杂中文字符...能出错的地方多了,而且以前的编译器警报也没现在的准确。
    lu18887
        42
    lu18887  
       2014-07-30 09:01:23 +08:00
    楼主值得鼓励,不懂就问,没有错!不要气馁!
    roychan
        43
    roychan  
       2014-07-30 09:02:48 +08:00
    呃……为什么不用 switch 呢?
    byron
        44
    byron  
       2014-07-30 09:17:43 +08:00
    @roychan 还没学到哪里。
    Geeker
        45
    Geeker  
       2014-07-30 09:18:23 +08:00
    很多人在不会的时候连问的勇气都没有!每个人都是这么过来的。加油
    rulerstorm
        46
    rulerstorm  
       2014-07-30 09:29:03 +08:00
    写得还可以啊,这明显是小朋友的炫耀贴~
    frankzeng
        47
    frankzeng  
       2014-07-30 09:36:14 +08:00
    result >= 80 && result < 90 ,没这么写的啊,明显是result<90是多余的,你想啊,如果result=85,第一个判断肯定为假,第二个>=80就为真的,后面的&& result<90就是多余的
    GPU
        48
    GPU  
    OP
       2014-07-30 09:37:15 +08:00
    @rentaro 我用的是ubuntu 的GCC 随便装的环境 , 我编译好运行成功了 才发现你说的没有添加 分号

    @Ricepig 我数学略渣 .要慢慢意会一下.哈.

    @jesse_luo 是的,上面有人也提过我 , 在#28里

    @em70 是的呢,昨晚找到了一个百度文库有人分析的常见错误可以看啊可能.

    @abscon 你这个错误是不是缺少花括号了?


    @bombless @lu18887 @Geeker 谢谢你们鼓励 .我会努力的 , 恩!
    GPU
        49
    GPU  
    OP
       2014-07-30 09:40:08 +08:00
    @frankzeng 原本是" result < 90 && result >= 80 " 这样子写的,然后编译出来结果不对就掉过来了,然后也没有想太多成立不成立,结果对就可以,然后就发上来了.

    @rulerstorm 这算是损还是什么呢 ,^ ^ .
    zuo
        50
    zuo  
       2014-07-30 09:40:36 +08:00
    @frankzeng 猛然发现确实,尼玛,以前学习的时候怎么就没有想到了
    ljcarsenal
        51
    ljcarsenal  
       2014-07-30 09:48:02 +08:00
    @crab yuange真的已经达到十分吊的地步了嘛。。。。。不过他可真是毫不谦虚啊。。。那些大神也是一直吹捧他
    frankzeng
        52
    frankzeng  
       2014-07-30 09:48:07 +08:00
    @zuo 逻辑上没有什么区别,就是代码看起来不够优雅而已。

    @GPU 这C/C++编译出错容易解决了,难的是跑出来的结果不是你想要的,调试才麻烦。
    xavierskip
        53
    xavierskip  
       2014-07-30 09:52:56 +08:00
    LZ web app都能写,这点C搞不定?
    shawngao
        54
    shawngao  
       2014-07-30 09:56:10 +08:00
    } else if ( result >= 80 && result < 90 ){

    这个“ && result < 90 ”没必要吧
    precisi0nux
        55
    precisi0nux  
       2014-07-30 10:00:53 +08:00
    这样来问很浪费时间,不如找本正统的教材看。
    kid177
        56
    kid177  
       2014-07-30 10:13:19 +08:00
    这样低级的错误,感觉还是LZ没有仔细去学吧。

    不过也不能怪LZ,想当初我int main写成int mian硬是调了1个下午
    auser
        57
    auser  
       2014-07-30 10:27:17 +08:00
    @yukirock 标准规定main函数可以不显示return的

    C中的函数要是没有参数,建议加上void,例如:
    long random(void);
    写成:
    long random()
    这种形式编译器无法帮助检查错误的参数传递

    吹毛求疵下:
    result是否应该有一个合理的范围呢?比如[0,100]
    如果scanf时候输入了非法字符怎么办?[好多年没用过scanf这个函数了……这里楼主可以暂时先检查scanf的返回值]
    abscon
        58
    abscon  
       2014-07-30 10:34:15 +08:00
    @GPU 不是我的错误,是我同学的错误。错误不在于缺少花括号。如果你坚持要花括号的话我给你花括号。你看看,能看出错误在哪里不。看不出的话说明你的那个错误意识还没有纠正过来(代码是动态的过程,不是静态的状态)

    #include <stdio.h>

    int main()
    {
    char ch;
    scanf( "%c",&ch );
    if( ch == 'a' ) {
    ch = 'A';
    }
    if( ch == 'A' ) {
    ch = 'a';
    }
    printf( "%c\n", ch );
    return 0;
    }
    abscon
        59
    abscon  
       2014-07-30 10:35:32 +08:00
    @livid 抗议编辑器自作主张去掉了排版用的空格
    sampeng
        60
    sampeng  
       2014-07-30 10:36:59 +08:00
    你需要一本正规的教材。靠猜是没戏的
    hcy
        61
    hcy  
       2014-07-30 11:03:54 +08:00
    如果LZ一会反应不过来可以先这样写
    #include <stdio.h>

    int main()
    {
    int result;
    scanf("%d",&result);

    if ( result >= 90 ){
    printf("A\n");

    } if ( result >= 80 && result < 90 ){
    printf("B\n");

    } if ( result >= 70 && result < 80 ){
    printf("C\n");

    } if ( result >= 60 && result < 70 ){
    printf("D\n");

    } if(result <60){

    printf("E\n");
    }
    return 0;
    }
    GPU
        62
    GPU  
    OP
       2014-07-30 11:06:22 +08:00
    @abscon 我明白了 , 最后他还是输出一个 小写'a' .. 他应该在判断 是否等于 'A' 的那个if 前面添加一个else 就可以了.

    @sampeng 真不是教材问题 我也有K&R 在哪里.
    @kid177 我看视频学的 .过后再看一次K&R .
    @xavierskip 我哪里会写Web App 了啦.
    gejigeji
        63
    gejigeji  
       2014-07-30 11:08:54 +08:00
    要不LZ自杀呗
    StackGao
        64
    StackGao  
       2014-07-30 11:10:20 +08:00
    楼上心理有问题, 楼主不要介意.
    hcy
        65
    hcy  
       2014-07-30 11:16:14 +08:00
    看了下那个switch 我觉得LZ还是去弄本教材吧... 你输入个92之类参数再看看?
    abscon
        66
    abscon  
       2014-07-30 11:17:51 +08:00
    @GPU Bingo. 你自己的那个程序,画一个流程图,你就会发现哪里有冗余的判断了。
    GPU
        67
    GPU  
    OP
       2014-07-30 11:22:52 +08:00
    @hcy 突然又傻了. 没想到这个哈.
    @abscon 你是说的if 那个还是switch 的 ?

    反正看了#65 的我又学到东西了.原来除10 就是为了这个.
    GPU
        68
    GPU  
    OP
       2014-07-30 11:25:19 +08:00
    @hcy 你是想让我明白什么呢? 我还没看出你的意图来.
    abscon
        69
    abscon  
       2014-07-30 11:35:32 +08:00
    @GPU 就是本帖顶楼贴出来的那个。if的
    lemonlwz
        70
    lemonlwz  
       2014-07-30 11:43:51 +08:00
    很想知道楼今年贵庚
    cassyfar
        71
    cassyfar  
       2014-07-30 12:33:35 +08:00 via iPad
    lz这理解力肯定是来卖萌的
    amon
        72
    amon  
       2014-07-30 14:43:46 +08:00
    不建议把这样的问题发到v2,v2的精神是explore。
    可以考虑去相关的学习群或者bbs。
    LZ加油:)
    gejigeji
        73
    gejigeji  
       2014-07-30 15:02:15 +08:00
    @StackGao 嘻嘻
    gejigeji
        74
    gejigeji  
       2014-07-30 15:03:12 +08:00
    @StackGao 我错了
    Geass
        75
    Geass  
       2014-07-30 15:41:18 +08:00
    @kid177 我写嵌入式的时候也干过这种事情==
    tttwww18
        76
    tttwww18  
       2014-07-30 16:19:50 +08:00
    #include <stdio.h>
    int main()
    {
    char* g="FFFFFFDCBAA";
    int d;
    scanf("%d",&d);
    (d>=0 && d<=100)?printf("%c\n",g[d/10]):printf("Out of range");
    return 0;
    }
    这样写如何呢?
    GPU
        77
    GPU  
    OP
       2014-07-30 16:40:38 +08:00
    @tttwww18 爆了. 但是看不懂.
    magine
        78
    magine  
       2014-07-30 16:48:55 +08:00
    @tttwww18
    出门拜大神。
    话说三目运算符现在都不怎么推荐使用了吧。
    w2angel
        79
    w2angel  
       2014-07-31 08:53:52 +08:00 via Android
    居然看到一个这样写的
    90 < result && result > 80 && result = 80
    麻烦不要误导别人好不好
    HatMatrix
        80
    HatMatrix  
       2014-07-31 12:29:42 +08:00
    我怎么觉得你们都被楼主嫖了,都用github了不应该这个水平啊,你们说呢
    GPU
        81
    GPU  
    OP
       2014-07-31 13:58:19 +08:00
    @HatMatrix 我git 命令都不懂三个以上,你真确定我懂github?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2404 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 15:45 PVG 23:45 LAX 08:45 JFK 11:45
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86