C 这两种解决方案的区别是什么?

C 这两种解决方案的区别是什么?,c,C,问题:从输入到输出重写小数字。停止处理 读取数字42后输入。输入的所有数字都是 一个或两个数字的整数 范例 输入:1 2 88 42 99 产出:1 288 我的解决方案: #include<stdio.h> int main() { int i; scanf("%d",&i); while(i!=42) { printf("%d",i); scanf("%d",&i); } return 0; } #包括 int main() { int i; scanf(“%

问题:从输入到输出重写小数字。停止处理 读取数字42后输入。输入的所有数字都是 一个或两个数字的整数

范例

输入:1 2 88 42 99

产出:1 288

我的解决方案:

#include<stdio.h>
int main()
{
int i;
scanf("%d",&i);
while(i!=42)
{ 
printf("%d",i);
scanf("%d",&i);
}
return 0;
}
#包括
int main()
{
int i;
scanf(“%d”、&i);
而(i!=42)
{ 
printf(“%d”,i);
scanf(“%d”、&i);
}
返回0;
}
正确的解决方案:

#include <stdio.h>

int main( void ) {
int i;
while( 1 ) {
    scanf( "%d", &i );
    if( i == 42 ) break;
    printf( "%d\n", i );
}
return 0;
}
#包括
内部主(空){
int i;
而(1){
scanf(“%d”、&i);
如果(i==42)中断;
printf(“%d\n”,i);
}
返回0;
}
如果输入为42,两个程序都结束,那么两者之间的区别是什么


编辑:我刚刚意识到这应该发布在codereview.stackexchange.com管理员处,请执行所需操作。

在第一个程序中,您在用户输入第一个值后输入循环,因此您必须在while条件下检查该值


相反,第二个程序总是在循环内检查输入,因此更清晰。

在第一个程序中,用户输入第一个值后,您进入循环,因此您必须在while条件下检查该值


相反,第二个程序总是在循环内检查输入,因此更清晰。

它们在功能上是等效的,我个人更喜欢您的解决方案:
,而(1)
被包括我在内的一些人认为是不好的做法。只需查看单行,而不必跟踪代码,就可以更容易地看到while循环何时终止。除此之外,还有一些不同之处:

  • 您需要缩进代码,否则代码很难阅读
  • 您没有打印换行符(
    \n

它们在功能上是等价的,我个人更喜欢你的解决方案:
,而(1)
被包括我在内的一些人认为是坏习惯。只需查看单行,而不必跟踪代码,就可以更容易地看到while循环何时终止。除此之外,还有一些不同之处:

  • 您需要缩进代码,否则代码很难阅读
  • 您没有打印换行符(
    \n

从问题本身来看,我可以说这是一个编程竞赛网站练习题


这些网站也符合您回答问题的格式。因此,换行符(\n)是必要的。

从问题本身来看,我可以说它来自编程竞赛网站实践问题之一


这些网站也符合您回答问题的格式。所以换行符(\n)是必要的。

不要太多。我看到的唯一区别是:

  • 打印每个数字后,不输出换行符“\n”

  • 您的代码不是完全“干的”(您重复了
    scanf(“%d”、&i);

  • 否则它们(在功能上)是相同的。但我不得不补充一点:

    • 你的代码有点难看。。。使用适当的缩进
        不要太多。我看到的唯一区别是:

      • 打印每个数字后,不输出换行符“\n”

      • 您的代码不是完全“干的”(您重复了
        scanf(“%d”、&i);

      • 否则它们(在功能上)是相同的。但我不得不补充一点:

        • 你的代码有点难看。。。使用适当的缩进
        一个打印“\n”,另一个不打印。我相信它们严格等同,一些铁杆的不去不破的家伙甚至会说你的代码更优雅。我同意@Medinoc。我讨厌
        ,而(1)
        语句,就像它们表面上一样,似乎永远循环。如果代码的意图是在特定条件下停止,那么编写代码时应该清楚地反映该意图。一个打印“\n”,一个不打印。我相信它们是严格等效的,一些铁杆的“不去不破”的家伙甚至会说您的代码更优雅。我同意@Medinoc。我讨厌
        ,而(1)
        语句,就像它们表面上一样,似乎永远循环。如果代码的意图是在特定条件下停止,那么编写代码时应明确反映该意图。但这不是spoj法官拒绝第一个的原因。但这不是spoj法官拒绝第一个的原因。为什么
        而(1)
        被视为不良做法?你反对所有形式的无限循环吗?还是你更喜欢
        while(true)
        for(;;)
        goto
        …?我个人并不喜欢无限循环,因为我上面说过。我认为它更清晰,也不太可能导致bug,因为可能有一些代码路径是您错过的,它们不会在应该的时候中断。正如我所说的,这是我(至少还有一些人,请参阅对问题的评论)的观点,它在功能上仍然是正确的。感谢您进行更新。我不确定我是否同意你的推理,但原因现在已经很清楚了:-)我不明白
        而(1)
        做了什么。1只是一个常数。为什么它被视为循环条件?1是否意味着在执行
        while
        循环的主体之前不计算任何条件?如果是这种情况,那么我可以不输入其他字符或数字而不是1吗?在C中,不存在true和false这两种情况—相反,
        0
        (作为整数)被处理,false非零值被视为true。因此,C中的
        1
        true
        while(1)
        表示“永远循环”。为什么
        while(1)
        被认为是不好的做法?你反对所有形式的无限循环吗?还是你更喜欢
        while(true)
        for(;;)
        goto
        …?我个人并不喜欢无限循环,因为我上面说过。我认为它更清晰,也不太可能引起bug,因为