V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
GPU
V2EX  ›  程序员

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

  •  
  •   GPU · 2014-07-29 22:55:07 +08:00 · 6355 次点击
    这是一个创建于 3803 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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。
    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   ·   实用小工具   ·   1035 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:22 · PVG 04:22 · LAX 12:22 · JFK 15:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.