zeroto-alittel 发表于 2023-5-31 20:30:18

程序作用相同吗?

下面这个程序输出结果为空
#include <stdio.h>
int main(void)
{
int x,i;
for(i=1;i<=100;i++)
{
if(++i%2==0)
if(++i%3==0)
       if(++i%7==0)
printf("%d ",i);
}
printf("\n");
}
但是改为如下程序,却能输出68 70,这是为何,这两个程序实现的功能不是一个意思吗?
#include <stdio.h>
int main(void)
{
int x,i;
for(i=1;i<=100;i++)
{
x=i;
if(++x%2==0)
if(++x%3==0)
       if(++x%7==0)
printf("%d ",x);
}
printf("\n");
}

isdkz 发表于 2023-5-31 20:35:04

@sfqxx

sfqxx 发表于 2023-5-31 20:37:07

这两个程序实现的功能并不完全相同,导致了输出结果的差异。

在第一个程序中,使用了连续的三个if语句来判断并输出满足条件的数。然而,每次进入if语句块后,i的值都会自增,并在下一个循环中继续递增。这导致了一些数被跳过,无法满足后续条件。

具体来说,当i的值为68时,第一个if语句的条件(++i % 2 == 0)为真,进入if语句块后,i的值被递增为69。然后,第二个if语句的条件(++i % 3 == 0)为假,因为69除以3的余数不等于0,所以69被跳过了。同样的情况也适用于其他数。

第二个程序中,通过引入一个额外的变量x来解决了这个问题。在每次进入if语句块之前,将i的值赋给x。这样,每个if语句块中的x都是独立的,不会受到其他if语句块的影响。

因此,第二个程序能够正确地输出满足条件的数68和70,而第一个程序则无法输出任何结果。

zeroto-alittel 发表于 2023-5-31 20:52:50

sfqxx 发表于 2023-5-31 20:37
这两个程序实现的功能并不完全相同,导致了输出结果的差异。

在第一个程序中,使用了连续的三个if语句来 ...

谢谢,但是有些不懂,“因为69除以3的余数不等于0”,69除以3的余数不就是0吗?怎么会跳过呢?

sfqxx 发表于 2023-5-31 20:56:01

zeroto-alittel 发表于 2023-5-31 20:52
谢谢,但是有些不懂,“因为69除以3的余数不等于0”,69除以3的余数不就是0吗?怎么会跳过呢?

你的观察是正确的,69除以3的余数确实是0。但在这里我们需要理解C语言中的`++`运算符的行为。

在你的第一个代码中,你在每次检查除法条件前都用了`++i`。这实际上会在每次条件检查前将`i`加1,这就意味着`i`在每次循环中其实增加了4次:一次是在for循环语句中,其他三次是在条件检查中。所以,每个可能的`i`值实际上都跳过了3个数字。当`i`等于66时(这是循环中的第17次迭代),你的代码会检查`67%2`、`68%3`和`69%7`,所以并没有检查69除以3的情况。

然而在第二段代码中,你创建了一个新的变量`x`,并在每次循环开始时将`i`的值赋给`x`,然后增加`x`的值而不是`i`的值。因此,在这种情况下,你的代码在每个迭代中都会检查相邻的三个数是否可以被2、3和7整除,即对于`i=66`,会检查`67%2`、`68%3`和`69%7`。这就是为什么第二段代码可以打印出68和70,而第一段代码的输出为空。

zeroto-alittel 发表于 2023-5-31 21:01:24

sfqxx 发表于 2023-5-31 20:56
你的观察是正确的,69除以3的余数确实是0。但在这里我们需要理解C语言中的`++`运算符的行为。

在你的 ...

专业!厉害!多谢!

sfqxx 发表于 2023-5-31 21:03:17

zeroto-alittel 发表于 2023-5-31 21:01
专业!厉害!多谢!

不客气~
页: [1]
查看完整版本: 程序作用相同吗?