C语言中的if语句无法正常工作

4

新手在尝试运行一些基本代码。我有一些 if 语句,当我尝试一起运行它们时,它们就不起作用了,但是当我通过注释其他 if 语句来隔离最后一个 if 语句时,它就可以工作(为您展示了如何做到这一点的注释)。有人能解释一下为什么这些 if 语句无法一起工作吗?(我尝试了 else if,但还是不行)。

在这里,您必须将数字 1、2 和 3 分别选择为 x、y 和 z,输出应随机将 aaa、bbb 或 ccc 分配给 1。如果我的代码很丑,请见谅。谢谢!

    int x, y, z, a, b, c, d, e, aaa, bbb, ccc, r;

    a = 0;
    b = 0;
    c = 0;
    aaa = 0;
    bbb = 0;
    ccc = 0;

    printf("Pick x:\n");
    scanf("%d",&x);

    printf("Pick y:\n");
    scanf("%d",&y);

    printf("Pick z:\n");
    scanf("%d",&z); 

    printf("You chose %d, %d, %d.\n",x,y,z);

if (x == 1 || y == 1 || z == 1) {a = (1);}

    printf("a = %d\n", a);

if (x == 2 || y == 2 || z == 2) {b = (1);}

    printf("b = %d\n", b);

if (x == 3 || y == 3 || z == 3) {c = (1);}

    printf("c = %d\n", c);

    if (a == 1 && b == 1 && c == 1 && d != 1 && e != 1) {
        /*if (aaa < bbb && aaa < ccc) {aaa = (aaa + 1);}
        if (bbb < aaa && bbb < ccc) {bbb = (bbb + 1);}
        if (ccc < bbb && ccc < aaa) {ccc = (ccc + 1);}
        if (aaa == bbb && aaa != ccc){int r = rand() % 2 + 1;
            printf("aRANDOM2 = %d\n",r);
            if (r == 1) {aaa = (aaa + 1);}
            if (r == 2) {bbb = (bbb + 1);}
        if (aaa == ccc && aaa != bbb){int r = rand() % 2 + 1;
            printf("bRANDOM2 = %d\n",r);
            if (r == 1) {aaa = (aaa + 1);}
            if (r == 2) {ccc = (ccc + 1);}
        if (ccc == bbb && aaa != ccc){int r = rand() % 2 + 1;
            printf("cRANDOM2 = %d\n",r);
            if (r == 1) {ccc = (ccc + 1);}
            if (r == 2) {bbb = (bbb + 1);}*/
        if (aaa == bbb && bbb == ccc){int r = rand() % 3 + 1;
            printf("RANDOM3 = %d\n",r);
            if (r == 1) {aaa = (aaa + 1);}
            if (r == 2) {bbb = (bbb + 1);}
            if (r == 3) {ccc = (ccc + 1);}
}}/*}}}*/


    printf("aaa = %d\n", aaa);
    printf("bbb = %d\n", bbb);
    printf("ccc = %d\n", ccc);

return 0;

你的main函数和头文件声明在哪里? 最好完整地发布代码。 - sunny1304
6
简短的答案是,你写了难以辨认的代码,现在你已经无法阅读它。需要考虑以下几点:(1)使用更多、更小、有意义的函数;(2)使用有意义的变量名;(3)编写像英语一样易读的 if 语句。学习编程技能的重要一部分是管理复杂性(即简化)。如果你连自己的手写字都看不懂,那么很难做出成果。 - sircodesalot
你的代码还不够完善。但我可以告诉你,is语句是有效的。你只是编写错误了。很难知道你应该写什么。 - David Heffernan
将您的代码通过格式化工具(如astyle)运行,或手动设置所有缩进为合理的值,并在带有语法高亮的编辑器中查看它。您很可能会发现问题。 - Julian
请更具体地说明您所说的“不起作用”是指什么。您指的是哪个“if”语句?您期望发生什么?而实际上又发生了什么? - Raymond Chen
de被使用了,但没有被初始化。 - pat
1个回答

1
在进行评论之前,最后三个 aaa/bbb/ccc 的 if 语句中的每一个都嵌套在前面的 if 语句中。因此,当 if (aaa == bbb && aaa != ccc) 测试为 false 时,所有代码都会被跳过直到闭合括号的那一行。
换句话说,它实际上是这样做的:
    if (aaa == bbb && aaa != ccc) {
        int r = rand() % 2 + 1;
        printf("aRANDOM2 = %d\n",r);
        if (r == 1) {aaa = (aaa + 1);}
        if (r == 2) {bbb = (bbb + 1);}
            if (aaa == ccc && aaa != bbb) {
            int r = rand() % 2 + 1;
            printf("bRANDOM2 = %d\n",r);
            if (r == 1) {aaa = (aaa + 1);}
            if (r == 2) {ccc = (ccc + 1);}
            if (ccc == bbb && aaa != ccc) {
                int r = rand() % 2 + 1;
                printf("cRANDOM2 = %d\n",r);
                if (r == 1) {ccc = (ccc + 1);}
                if (r == 2) {bbb = (bbb + 1);}
                if (aaa == bbb && bbb == ccc) {
                    int r = rand() % 3 + 1;
                    printf("RANDOM3 = %d\n",r);
                    if (r == 1) {aaa = (aaa + 1);}
                    if (r == 2) {bbb = (bbb + 1);}
                    if (r == 3) {ccc = (ccc + 1);}
                }
            }
        }
    }
}

你可能想要做的是将三个右括号移动到它们各自块的末尾,像这样:

    if (aaa == bbb && aaa != ccc) {
        int r = rand() % 2 + 1;
        printf("aRANDOM2 = %d\n",r);
        if (r == 1) {aaa = (aaa + 1);}
        if (r == 2) {bbb = (bbb + 1);}
    }
    if (aaa == ccc && aaa != bbb) {
        int r = rand() % 2 + 1;
        printf("bRANDOM2 = %d\n",r);
        if (r == 1) {aaa = (aaa + 1);}
        if (r == 2) {ccc = (ccc + 1);}
    }
    if (ccc == bbb && aaa != ccc) {
        int r = rand() % 2 + 1;
        printf("cRANDOM2 = %d\n",r);
        if (r == 1) {ccc = (ccc + 1);}
        if (r == 2) {bbb = (bbb + 1);}
    }
    if (aaa == bbb && bbb == ccc) {
        int r = rand() % 3 + 1;
        printf("RANDOM3 = %d\n",r);
        if (r == 1) {aaa = (aaa + 1);}
        if (r == 2) {bbb = (bbb + 1);}
        if (r == 3) {ccc = (ccc + 1);}
    }
}

除了 aaa、bbb 和 ccc 在 if 语句之前没有被更新的事实外。 - Asthor
感谢你耐心解决了这个问题。这样做就成功了。 - user3399201
哇!现在我发现当事物被评估为真时,后来的if语句可能会评估为真,而最初是假的。非常有趣!使用else if()可以解决这个问题。 - user3399201
因为一些变量在之前的if语句块中被改变了,所以是的。如果你不想发生这种情况,你可以在最后三个if块中使用"else if"代替"if"。 - Warren Dew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接