鱼C论坛

 找回密码
 立即注册
查看: 972|回复: 6

[已解决]程序作用相同吗?

[复制链接]
发表于 2023-5-31 20:30:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面这个程序输出结果为空
#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");
}
最佳答案
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,而第一段代码的输出为空。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-31 20:35:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,而第一个程序则无法输出任何结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

谢谢,但是有些不懂,“因为69除以3的余数不等于0”,69除以3的余数不就是0吗?怎么会跳过呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,而第一段代码的输出为空。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

在你的 ...

专业!厉害!多谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-31 21:03:17 | 显示全部楼层
zeroto-alittel 发表于 2023-5-31 21:01
专业!厉害!多谢!

不客气~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 21:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表