我刚学会了一个很棒的模式(实际上是从JavaScript学到的),我想将它应用到我的C++代码中。
为了解释这个模式,假设我将一个字符串表示为这些元素的链表:
struct link_char;
struct link_char
{
link_char * next;
char code;
};
请注意,任何link_char字符串的最后一个字符都将具有code==0。
这个属性意味着我可以在字符串中检查值,同时使用&&短路来防止空指针访问。
bool equals_hello( const link_char * first_char )
{
const link_char * c = first_char;
return c->code=='h'
&& (c=c->next)->code=='e'
&& (c=c->next)->code=='l'
&& (c=c->next)->code=='l' // if string == "hel", we short-circuit here
&& (c=c->next)->code=='o';
}
我的问题涉及安全性,而非可读性。 我知道当且仅当 && 没有被重载时,短路运算将起作用。但是,赋值操作是否会按正确顺序执行或者这是实现定义的呢?
上述示例明确说明了可以发生读取/写入的位置,但我也想在可能存在副作用的情况下使用此模式。例如:
// think of these as a bunch of HRESULT type functions
// a return value of 0 means SUCCESS
// a return value of non-zero yields an Error Message
int err;
( !(err=initialize()) && !(err=create_window()) && !(err=run_app() )
|| handle_error(err);
这些操作跨平台是否按预期工作?我已经读过“如果你在一个表达式中两次读取一个变量,同时你也写了它,结果是未定义的”。但直观地感觉短路保证了顺序,难道不是吗?
&&
是一个序列点,但我可能错了。 - GWWcode
进行解引用之前不会检查是否为NULL
。 - Merlyn Morgan-Grahamif ((err = initialize()) || (err = create_window()) || (err == run_app())) handle_error(err);
。 - Tony Delroy