跳转到内容

D 入门指南/条件和循环/简单循环

来自维基教科书,开放世界中的开放书籍


D 中最简单的循环之一是while循环。只要其条件为真,该循环就会一直循环。这也使得while循环非常灵活 - 几乎任何类型的循环都可以写成while循环,如果你足够努力的话。一个while循环看起来像这样

while(condition)
{
	//code goes here
}

while循环将检查条件是否为真,如果为真,它将运行其中的代码。它将一直这样做,直到条件变为假。

如上一节所示,foreach循环对于循环遍历某种容器的内容非常有用。但是,当你不知道你有多少数据时该怎么办,比如当你从文件中读取数据时?一个while循环在这种情况下可以提供帮助。

import std.stdio;
import std.stream;

void main()
{
	char[][] names;
	File input = new File("names.txt");
	
	while(input.eof() == false)
		names ~= input.readLine();
		
	writefln("Read ", names.length, " names.");

	foreach(name; names)
		writefln(name);
}

因此,这里我们创建一个名为names的字符串数组,用于保存我们将从文件中读取的姓名列表。然后我们创建一个File对象。记得在基本输入部分,我们使用din从控制台读取一行文本?din实际上是一种File对象,所以我们在这里做同样的事情,除了我们从磁盘上的文件读取而不是从用户那里读取。

这里重要的是while循环。让我们仔细看看它

while(input.eof() == false)
	names ~= input.readLine();

条件是input.eof() == false. 该.eof()方法 ofFile表示“文件末尾”。所以我们将使用这个循环来读取数据,直到我们到达文件末尾。换句话说,我们将读取文件中所有的数据。循环体就是这么做的 - 它从文件中读取一行,并将它追加到我们的姓名列表的末尾。

在我们的程序结束时,我们使用熟悉的foreach循环输出姓名列表。

另一种非常类似的循环是do-while循环。在一个while循环中,条件位于循环的开头,但在一个do-while循环中,条件位于循环的末尾。之所以重要,是因为对于一个while循环,如果条件在第一次就为假,循环体将永远不会运行,所以while循环可以运行其主体0 次或多次。但是对于一个do-while循环,循环体将运行至少一次,然后再检查条件。do-while循环看起来像这样

do
{
	code
} while(condition)

这种循环经常出现的一种情况是,当你试图从用户那里获取有效输入时。通常你会要求用户输入一些内容,然后你检查它是否有效,如果无效,你就会一直询问他们,直到他们给你一个好的内容。这就是do-while循环的用处:它将至少运行一次输入代码,并一直运行,直到条件满足。

import std.stdio;
import std.cstream;

void main()
{
	bool valid = false;
	bool yes;

	do
	{
		writef("Delete all your data?  y/n: ");

		char[] response = din.readLine();

		if(response.length > 0)
		{
			if(response[0] == 'y')
			{
				yes = true;
				valid = true;
			}
			else if(response[0] == 'n')
			{
				yes = false;
				valid = true;
			}
		}
	} while(valid == false)
}

这段代码使用valid变量来跟踪用户输入的内容是否有效。一旦他们输入有效的内容,它将被设置为true. 然而,在那之前,do-while循环将一直循环,要求用户输入。

华夏公益教科书