以下一段代码是一个 C 语言中的循环结构,它使用了 scanf 函数来读取用户输入。让我们逐步分析这段代码:
while (~scanf("%d",&n)) {
// ...
}
scanf("%d",&n)
用于从标准输入读取一个整数,并将其存储在变量 n 中。如果成功读取一个整数,scanf 返回读取的项数(在这个情况下是1)。如果读取失败或遇到文件结束(EOF),则返回 EOF(在大多数系统上,EOF 的值是 -1)。
~scanf("%d",&n)
中,“~ ”是按位取反操作符。当scanf成功读取一个整数时(返回1),~1
会得到-2
(假设在二进制补码表示法中)。当scanf失败或遇到 EOF(返回 -1),~-1
会得到 0
。因此,此表达式将scanf的返回值转换为布尔值:成功读取为 “true”(非零),失败或 EOF 为 “false”(零)。
因此,while (~scanf("%d",&n))
语句会持续执行其内部的代码块,只要 ~scanf("%d",&n)
的结果为非零,即scanf成功读取了一个整数。一旦scanf失败或遇到 EOF,循环将终止。
通常,这种结构用于读取一系列整数,直到用户输入的不是整数或者达到某种输入结束的条件(如文件结束或遇到特定的字符)。
需要注意的是,如果用户输入了非整数(如字符或字符串),scanf 将不会读取该输入,并返回失败。这可能导致程序陷入一个无限循环,因为它会一直等待有效的整数输入,而不会读取或丢弃无效的输入。为了避免这种情况,可以使用其他方法(如 fgets 和 sscanf)来更灵活地处理输入。