【发布时间】:2011-09-26 12:18:37
【问题描述】:
我刚刚学到了这个很棒的模式(实际上是从 javascript 中学到的),我想将它应用到我的 c++ 代码中。
为了解释这个模式,假设我将一个字符串表示为这些的链表:
struct link_char;
struct link_char
{
link_char * next;
char code;
};
请注意,任何 link_char 字符串的最后一个字符将始终具有 code==0。 这个属性意味着我可以检查字符串中的值,同时使用 && 短路来防止 NULL 指针访问。
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);
这些类型的操作会按预期跨平台工作吗?我读过“如果你在一个表达式中读取一个变量两次,你也写它,结果是未定义的”。但直觉上我觉得短路保证了顺序,不是吗?
【问题讨论】:
-
我假设没关系,因为
&&是一个序列点。但我可能弄错了。 -
回复:您对可读性的评论;我不会签入这样的代码,除非我想用指向这个问题的链接来评论它的每个实例:)
-
另外,您的第一个示例在取消引用
code之前不会检查NULL。 -
恕我直言,我不会推荐这种编码风格。所以我不在乎它是否有效。
-
链接条件和捕获错误代码并非不合理,但更容易阅读
if ((err = initialize()) || (err = create_window()) || (err == run_app())) handle_error(err);。
标签: c++ c cross-platform variable-assignment logical-operators