2

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

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


背景

考虑以下一段 C# 代码:

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

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

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

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

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

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

这个答案让我想起了小时候和父母的许多讨论:“为什么我必须打扫房间?” - “因为我们这么说。” . 进一步的答案推测(即没有添加任何来源或论据)while()“hacky”并且“使用for(;;)更有意义”


我的研究

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


我的问题:

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

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

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

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

所以重复我的问题:

  • 为什么 C# 设计团队要复制这种行为?
4

2 回答 2

3

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

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

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

能够编写一个“永远”循环是一个小问题,避免拼写错误更为重要。
可读性是唯一重要的事情,你并没有为while().

在这个声明中应该发生什么?

 if() Foo(); 
于 2013-08-14T13:37:24.183 回答
1

C11 规范规定:

  1. 该声明

    for ( clause-1 ; expression-2 ; expression-3 )陈述

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

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

while-loop不是这种情况。然而,这是C11。ANSI C 并没有真正说明这一点。不过,我认为 C# 是基于 C 最常见的工作方式(s|ed),而不是它被指定的工作方式。

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

于 2013-08-14T14:10:46.617 回答