【发布时间】:2011-11-26 17:07:07
【问题描述】:
可能重复:
Is short-circuiting boolean operators mandated in C/C++? And evaluation order?
AFAIK 短路评估意味着布尔表达式仅被评估到我们可以保证其结果的程度。
这是 perl 中的一个常见习惯用法,我们可以在其中编写如下内容: (is_ok() 在“OK”时返回非零值)
is_ok() || die "It's not OK!!\n";
而不是
if ( ! is_ok() ) {
die "It's not OK!!\n";
}
这只是因为评估的顺序总是从左到右,这保证了最右边的语句只有在第一个语句不是“假”的情况下才会执行。
在 C 中我可以做类似的事情:
struct foo {
int some_flag;
} *ptr = 0;
/* do some work that may change value of ptr */
if ( 0!=ptr && ptr->some_flag ) {
/* do something */
}
使用这种成语安全吗?
或者在确保 ptr 不是零指针之前,编译器是否有可能生成评估 ptr->some_flag 的代码? (我假设如果它是非空的,它指向一些有效的内存区域)。
这种语法使用起来很方便,因为它可以在不丢失可读性的情况下节省打字(无论如何我认为)。但是我不确定它是否完全安全,这就是我想了解更多信息的原因。
注意:如果编译器对此有影响,我使用的是 gcc 4.x
【问题讨论】:
-
让我感到困惑的是,在 2011 年我们收到编译器警告时,人们仍然写完全不直观的
if (0 == x)而不是if (x == 0)。if (0 != x)很奇怪;if (0 != ptr)更糟!if (ptr),确定吗? -
我最近了解到我们现在称之为“尤达条件”stackoverflow.com/questions/2349378/…
-
@undur_gongor:哈,我喜欢!
标签: c