数学困难

3
新手报道,老实说有点傻傻分不清。
基本上,我在大学里修读编程导论(学习C语言),很喜欢学习编程,也想更进一步;然而,我确实在数学/逻辑方面遇到了很多困难。例如,每周我们都会有一些小测试,对于那些不包含(对您来说可能很容易但对我来说似乎相当复杂)数学代码行的测试我还好,否则我就会陷入困境。
以下是其中一个问题:
运行以下代码时将输出以下哪个? 答案:
#include<stdio.h>

void main()

{

    int a = 300, b = 100, c = 100;

    if(a >= 400)

        b = 300;

    c = 200;

    printf("%d, %d, %d\n", a, b, c);

}

所以,我基本上在多项选择题中回答了300、100、100,但答案是300、100、200。如果在多项选择中有选择300、300、200的选项,说实话,我会选择那个选项。我不明白为什么在结果中只改变了c的值?
老实说,在编程的这一部分,我真的很困难。但我决心继续努力。
如果你们有任何提示或建议,将不胜感激。
此致敬礼。

1
这行代码 c = 200; 告诉你 c 发生了变化。 - Ed Heal
2
欢迎来到SO!不要气馁。重要的是要理解程序中语句的执行方式以及赋值的工作原理。 - Iwillnotexist Idonotexist
4
使用调试器可以逐步展示程序的执行过程,即使程序没有崩溃也很有用 :) - Jean-François Fabre
1
if语句有一个条件(a >= 400),它控制着下一条“语句”的执行,本例中是b = 300;。因为接下来的是另一条语句c = 200;而不是关键字else,所以只要到达就会始终执行。 - Iwillnotexist Idonotexist
3
在我的看法中,编码风格很糟糕,因为在语句 b=300 中没有使用大括号。建议您养成在 if 或 while 语句中使用大括号的习惯。请注意,这不会改变原意。 - DisappointedByUnaccountableMod
显示剩余7条评论
4个回答

4
如果您查看代码,由于它们的初始化和代码已经被赋值。 但是,如果条件 >= 400 为真,即如果 300> = 400 为真,则b将更改。这是真的吗?不是。因此,b未更改。
无论您的代码中发生什么情况,都会将200分配给c
总之,自从声明(=300),(=100)和(=100)以来: 根本没有改变。 <块引用>在一个条件下更改。但是由于该条件为假,因此也不会更改。 总是更改(分配了200)。 因此,现在您可以计算出答案为什么?

谢谢你们的时间。在这里,你们帮了我很多。我曾经迷失在尝试解决这个问题的过程中。 :) - sls1981

3

执行按行进行,必要时控制分支。

最初,执行初始化的行:

int a = 300, b = 100, c = 100;

此时,变量的值为a = 300b = 100c = 100

if(a >= 400)
    b = 300;

if语句的工作原理如下:
if(condition)
    then-statement;

如果conditiontrue,则执行then-statement。否则,我们跳过它。在你的例子中,我们正在测试a>=400是否成立,因为到目前为止a是300,所以300>=400不成立,因此我们跳过语句b=300
此时,值仍然是a=300b=100c=100(因为我们没有改变任何内容)。
最后,你有一行:
c = 200;

这个语句没有被 if 语句守卫,所以它将总是执行。因此,我们更新变量c并将其设置为200。

此时,变量的值分别为a = 300b = 100c = 200

因此,在打印语句时,正是这些数值被打印出来。


这太棒了。那么你是说if语句只适用于其后的一行(b=300;),然后c = 200声明是它自己的新行,并且由于在代码中更靠下,覆盖了先前的c值声明?简单地说,我将c = 200行包含在if语句本身中,这是不正确的吗? :) - sls1981
1
if语句可以应用于以下两种形式:if(condition) statement; 或者一个代码块(一堆被花括号包裹的代码行,形如 if(condition) {statement-1; statement-2; ... statement-n;})。在你的例子中,由于if后面没有花括号,它只适用于b = 300不是c = 200 - peteykun
非常感谢。我真的很感激。 :) - sls1981

1
实际代码似乎是这样的。
 int a = 300, b = 100, c = 100;

    if(a >= 400)
       {
        b = 300;  
       }
    c = 200;

    printf("%d, %d, %d\n", a, b, c);
    }

如果是这样的话
 if(a >= 400)
        b = 300; 
        c= 200;

if后面的下一行将只是它(if)的一部分。

int c=10;
if(c==10)
printf("iam 10");
else
printf("iam not 10");

它的输出将是'iam 10'。

没有{}的条件语句(if, else..)只适用于下一行。循环语句(for, while..)也是如此。


非常感谢。如果它是这样写的话,我会更早地理解它。我习惯于看到带括号的if语句。你们都很棒。 :) - sls1981

0

你从这里开始:

int a = 300, b = 100, c = 100;

如果a(300) > 400,则对b发生了某些变化,它会更改为300。

if(a >= 400)

        b = 300;

但是a不大于400,所以代码的那部分不会被执行。 因此你仍然是300、100、100。 然后,代码的最后一部分:c = 200;是独立的。没有任何条件会触发它。当到达那行代码时,c总是会改变为200。 现在你有了 - a = 300,b = 100,c = 200。


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