为什么 C# 也不允许在 while 循环中出现空条件

本文关键字:条件 循环 while 不允许 为什么 | 更新日期: 2023-09-27 18:27:42

编辑:我改变了我的大部分问题,因为它太长了,虽然我的问题是一个事实的要求,但它被认为是基于意见的。话虽如此,请阅读我试图解释为什么恕我直言关闭这个问题是错误的评论。

另外:我想为我最初的问题道歉,我的母语不是英语,我不知道这个词[盲目]有如此负面的语气。我实际上在其他问题中使用了这个词。


背景

请考虑以下一段 C# 代码:

for(; /*empty condition*/ ;)
{
    //Infinite loop   
}

除其他方法外,这被认为是进行无限循环的良好做法。但是当我们尝试使用while loop类似的方法时,它永远不会编译:

while(/*empty condition*/)
{
    //Compiler error
}

起初我认为这是我编译器中的某种错误,但后来我阅读了C# language specification.我发现这是设计。为什么?因为 C# 基于 C,而 C 的行为方式是这样的。

所以现在的问题是,为什么C会这样表现?其他人已经在StackOverflow上问过这个问题。答案非常不令人满意,归结为:

它的行为是这样的,因为它在 C 语言规范中是这样描述的。

这个回答让我想起了小时候和父母的多次讨论:">我为什么要打扫房间?"——"因为我们这么说。进一步的答案推测(即没有添加任何来源或论据(while()"黑客">"使用for(;;)更有意义"。


我的研究

编辑:删除,因为它被认为是长。这基本上是为了弄清楚为什么C有这种结构。


我的问题:

经过我所有的研究,我得出结论,如果the for loop可以的话,while loop无法接受空洞的表达是不合逻辑的。

但是,如果这是真的,那么为什么 C# 语言设计团队要复制这个缺点呢?

:"C#是基于C的,你为什么要重新发明轮子?

没错,但为什么要做出同样不合逻辑的决定呢?如果你的祖父会跳桥,那么你也会这样做,只是因为你以他为原型?基于旧语言创建新语言难道不是避免/修复旧语言不合逻辑的陷阱的理想情况吗?

所以重复我的问题:

  • 为什么 C# 设计团队要复制此行为?

为什么 C# 也不允许在 while 循环中出现空条件

经过我的所有研究,我只能得出结论,while 循环无法接受空表达式是不合逻辑的。

一个非常牵强的结论。恕我直言,for(;;)循环是不合逻辑的(不仅在这方面(。

很明显,while() { ... }是可能的,但究竟有什么优点?
作为风格问题,我更喜欢for(;true;)而不是for(;;),它被误读的可能性较小。

能够编写"永远"循环是一个小问题,避免拼写错误更为重要。
可读性是唯一重要的事情,你没有为while()做太多的理由。

这个声明应该发生什么?

 if() Foo(); 

C11 规范指出:

  1. 声明

    for ( clause-1 ; expression-2 ; expression-3 )声明

    行为如下:表达式表达式-2 是 控制在每次执行 环形体。表达式表达式-3 被评估为空 每次执行循环体后的表达式。如果条款 1 是 声明,它声明的任何标识符的范围是余数 声明和整个循环,包括其他两个 表达 式;它是按照第一个之前的执行顺序到达的 控制表达式的计算。如果条款 1 是 表达式,它在第一个表达式之前被计算为 void 表达式 控制表达式的计算。158(

  2. 子句 1表达式 3 都可以省略。省略的表达式-2 替换为 非零常量。

while 循环并非如此。然而,这是C11。ANSI C并没有真正明确说明这一点。不过,我认为 C# 是基于 C 最常用的工作方式,而不是指定它的工作方式。

推测一下,我可以认为早期 C 中的 for 循环没有很好地定义,所以程序员发现你可以像 for (;;) 一样编写无限循环。为了与旧程序兼容,标准从未禁止这样做。所以真的没有理由这样写。我想这只是历史。