【问题标题】:why there is semicolon after loop while();为什么循环后有分号 while();
【发布时间】:2014-04-05 00:01:36
【问题描述】:

我正在阅读我朋友的代码,我看到了这个:

#include <stdio.h>
#include <conio.h>

void main()
{
    char string1[125], string2 [10];
    int i, j;
    printf("\nstring 1: ");
    gets(string1);
    printf("\nNstring2 : ");
    gets(string2);
    i = 0;
    while (string1[i] != 0)
    {
        j = 0;
        while (string1[i++] == string2[j++] &&string1[i-1] != 0 && string2[j-1] != 0)
            ;//i dont know what it mean and why we can put ;after while loop
        if (string1[i-1] != 0 && string2[j-1] == 0)
        printf("\nfound at position %d", i-j);
    }
    getch();
}

为什么我们可以把;放在while循环之后,任何人都可以帮忙?

【问题讨论】:

  • 通常称为“分号”。不确定英语是否是你的第一语言,所以仅供参考。
  • 在这种情况下,while 条件完成了所有“工作”,因此不需要循环体。
  • 但这是一个很好的观点:在 forwhileif 之后反射性地(并且不正确地)添加 ; 经常是新手程序中错误的原因(以及不那么新手的偶尔节目)。所以看到; 应该有一个危险信号——如果你看到它,请仔细检查它是否真的属于它。
  • 您也可以将; 单独放在一行中。它不必处于循环中。或者,您可以编写{ },它是一个空块,如果用作块,则相当于一个空语句。
  • 放这样一个“空语句”是个好习惯;在它自己的路线上,强调它是故意的。最好发表评论,解释发生了什么以及为什么你有一个空的声明。 /* without running off the end of string1 or string2, advance i and j to the first character not matching between string1 an string2 */ 或类似的东西——如果没有其他 cmets,我不确定作者想要做什么。

标签: c


【解决方案1】:

; 只是一个空语句,它是一个无操作,但它是 while 循环的主体。来自草案 C99 标准部分6.8.3 表达式和空语句

空语句(仅由分号组成)不执行任何操作。

while 语句6.8.5 部分定义如下迭代语句

while ( 表达式 ) 语句

所以在这种情况下,while 循环语句;

while循环的主要作用在这里:

string1[i++] == string2[j++]
        ^^^             ^^^

所以循环的每次迭代都会增加ij 直到整个条件:

string1[i++] == string2[j++] &&string1[i-1] != 0 && string2[j-1] != 0

计算为false

【讨论】:

  • 您可能想指出,while 仍然有退出条件,因为后增量变量。
  • 如果它为空,为什么我们必须使用它,我可以删除那行吗?
  • @user3376115 不,我们不能删除它 b/c 那么 while 循环的主体将是后续的 if 语句。这会产生完全不同的效果。
  • 最好记录您的意图并包含continue 声明。
  • 用户,while () 循环 always 需要跟在它后面的语句。即使你不想要一个,它仍然需要 some 声明。分号本身就是一个空语句,通过添加空语句,while() 很高兴有一个语句。如果删除了空语句,那么下一条语句现在将属于 while()。很多人写“while (xxx) /* nothing */;”或 "while (xxx) {}" 使其更清晰。
【解决方案2】:

分号就像空指令。如果我们没有在 while 之后放置任何指令或在 {} 中使用循环 while,我们必须使用分号告诉编译器我们想要从 while 循环中得到的只是执行这条空指令。

【讨论】:

    【解决方案3】:

    这称为semicolon. 在编程标准中,; 表示语句结束,或者在这种情况下它是一个空语句。它实际上是 while 循环体中的非操作,因此它实际上并没有做任何事情。

    【讨论】:

      【解决方案4】:

      通常,在 while 循环中,您有初始化、比较检查、循环体(一些处理)和迭代器(通常是添加索引或指针遍历,例如 next),如下所示:

      index = 0 // initialization
      while(index < 4) { // comparison, loop termination check
           printf('%c\n', mystring[index]); // Some processing
           index += 1; // iterate to next loop
      }
      

      至少没有最后一项,您将永远不会退出循环,因此通常循环体中包含多个语句。在这种情况下,他们使用这样的后增量:

      while (string1[i++] == string2[j++]);
      

      这在比较语句本身中进行比较(==)和迭代(后增量 ++),并且没有主体,因此没有理由添加任何其他语句。一个空白的循环体可以只用一个分号来表示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 1970-01-01
        • 2014-05-07
        • 1970-01-01
        • 2022-12-12
        相关资源
        最近更新 更多