【发布时间】:2010-10-24 15:31:00
【问题描述】:
情况:在 C++ 或 C# 中使用许多条件检查条件:
if (condition1 && condition2 && condition3)
{
// Do something
}
我一直认为这些检查的执行顺序并不能保证。所以不一定是第一个条件1,然后是条件2,然后才是条件3。我在使用 C++ 的时候就学会了它。我想我是被告知或在某处读到的。
直到知道我一直编写安全代码来解决以下情况下可能出现的空指针:
if ((object != null) && (object.SomeFunc() != value))
{
// A bad way of checking (or so I thought)
}
所以我在写:
if (object != null)
{
if (object.SomeFunc() != value)
{
// A much better and safer way
}
}
因为我不确定非空检查是否会首先运行,然后才会调用实例方法来执行第二次检查。
现在,我们最伟大的社区人士告诉我,这些检查的执行顺序保证按照从左到右的顺序运行。
我很惊讶。 C++ 和 C# 语言都是这样吗?
现在有人听过我以前听过的版本吗?
【问题讨论】:
-
C# 中的子表达式从左到右计算,始终是句点。 C/C++ 中的子表达式按序列点顺序计算。同一序列点中的两个表达式可以按任意顺序求值。如果您需要正式的定义,请在“序列点”上进行网络搜索。
标签: c# c++ deterministic non-deterministic