在While循环中使用1 == 1或true的含义

10

我最近看到一段使用1 == 1而不是true的while语句。

例如:

while (1 == 1) 
{
   // Do something
}

不是:

while (true)
{
   // Do something
}

它们似乎都是正确的并且会生成相同的结果,但我想知道(除了开发人员使用1 == 1而不是true之外 - 样式/习惯除外),从编译器角度来看,这对性能有什么影响,使用比较运算符是否会产生更大的开销?


5
我认为,没有区别,只是习惯。 - Backs
4
使用 for(;;) 可以节省一些字节 ;) 对于 code golf 很有帮助。 - James Webster
1
@CallumBradbury,我相信我已经使用了while (true)来创建一个线程,我希望它一直运行直到整个程序停止。 - James Webster
4
投票重新开放。正如@DavidL在他的回答中证明的那样,这个问题确实有一个明确的答案。 - Dmytro Shevchenko
1
@DmytroShevchenko 谢谢,无论如何我已经编辑了问题以符合问题指南。这也使得DavidL的答案更加相关。 - Steve
显示剩余8条评论
1个回答

15

它们没有区别。编译器会将它们优化为相同的中间语言。

1 == 1

IL_0000:  nop         
IL_0001:  br.s        IL_0005
IL_0003:  nop         
IL_0004:  nop         
IL_0005:  ldc.i4.1    
IL_0006:  stloc.0     // CS$4$0000
IL_0007:  br.s        IL_0003

IL_0000:  nop         
IL_0001:  br.s        IL_0005
IL_0003:  nop         
IL_0004:  nop         
IL_0005:  ldc.i4.1    
IL_0006:  stloc.0     // CS$4$0000
IL_0007:  br.s        IL_0003
任何选择使用其中一种方法而不是另一种方法,都完全是开发人员的风格偏好。

2
  • 1 == 1 的含义是“小心,这里可能有些奇怪”;
  • 当快速浏览代码时,while(true) 可能会被误认为是函数调用(例如 DoStuff(true))。
- Kasper van den Berg
2
@KaspervandenBerg 在编写良好的自我记录代码方面,这确实是一个很好的观点。尽管个人认为,无论哪种情况都需要大量的文档说明,因为你需要非常充分的理由来这样做。 - David L
谢谢@DavidL,我完全忘记了使用ildasm在IL级别比较这两个语句。 - Steve
1
@Steve 很高兴能帮忙。另外,这种情况下一个有用的工具是 LinqPad。它可能不会包含每个指令,但它会捕捉最重要的步骤,为您提供快速的概述。 - David L
由于语义相同,我认为开发者的喜好只能是风格或光学上的问题,或者可能是他们缺了一根手指。 - Peter - Reinstate Monica
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接