【问题标题】:Why does C# also not allow empty conditions in while loops? [closed]为什么 C# 在 while 循环中也不允许空条件? [关闭]
【发布时间】:2013-08-14 13:31:45
【问题描述】:

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

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


背景

考虑以下一段 C# 代码:

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

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

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

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

所以现在的问题是,为什么 C 会有这样的行为? Somebody else asked this question on StackOverflow already。答案非常不令人满意,归结为:

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

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


我的研究

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


我的问题:

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

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

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

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

所以重复我的问题:

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

【问题讨论】:

  • 我已经为你改了标题。如果您能想到任何事情,请随意将其更改为更合适的内容。原来是......邀请反对票。就我个人而言,我认为这是一个有趣的问题,尽管可以说只是 Stack Overflow 的切线话题。但是,如果幸运的话,这里的 C# 设计团队的成员可能会偶然发现这一点并提供第一手答案...
  • 为什么是C 标签????我不懂 C# 但你不能while(1)吗?
  • @Devolus: while(true) 将是 C# 中用于无限 while 循环的惯用语。
  • @David,如果 C# 有这样的结构,为什么要写这么长的帖子???
  • 为什么 C# 团队应该偏离众所周知的用法? C、Java、C++ 的行为方式类似。 C# 团队希望设计一种其他开发人员熟悉的语言。

标签: c# c language-design language-specifications


【解决方案1】:

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

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

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

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

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

 if() Foo(); 

【讨论】:

  • 错字很重要,所以 wile(){...} 应该是:while(){....}
  • @PhilipGullick - 已修复。
  • 我猜你是对的......我只是假设因为 for 有更多的功能,while 循环会有问题。我为自己能够研究的内容感到有点自豪,但是我标题中的盲目一词和我的帖子中的热情让我的问题引起了很多不请自来的关注。如果我知道我永远不会问它。
【解决方案2】:

C11 规范声明:

  1. 声明

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

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

  2. clause-1expression-3 都可以省略。省略的 expression-2 被替换为 非零常数。

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

推测一下,我可以认为早期 C 中的 for-loop 定义不明确,因此程序员发现您可以编写像 for (;;) 这样的无限循环。为了与旧程序兼容,标准从不禁止这样做。所以真的没有理由这样写。我猜这只是历史。

【讨论】:

  • 我知道,我自己读过。问题是为什么 for 循环会接受这样的结构而 while 循环不会。
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 2016-06-19
  • 2023-03-10
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
相关资源
最近更新 更多