c中的逻辑和赋值是安全的?

前端之家收集整理的这篇文章主要介绍了c中的逻辑和赋值是安全的?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我刚刚学到了这个伟大的模式(从 javascript实际上),我想把它应用到我的c代码.

为了解释这个模式,假设我将一个字符串表示为这些链接的列表:

struct link_char;
struct link_char
{
   link_char * next;
   char code;
};

请注意,任何link_char字符串的最后一个字符将始终具有代码== 0.
属性意味着我可以检查字符串中的值,同时使用& amp;&短路以防止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);

这些操作能否像预期的跨平台一样工作?我已经读过“如果你在一个表达式中读取一个变量两次,你也写了它,结果是未定义的”.但直觉上我觉得短路保证了顺序,不是吗?

解决方法

是.

内置逻辑与(&),逻辑OR(||)和逗号运算符(,)是唯一的二进制运算符C保证评估将计算左表达式然后(如果不短路)的情况)右表达式(逗号运算符当然总是评估两个操作数,第一个左边,然后右边).

还要注意,函数参数之间的逗号不是逗号运算符,因此函数参数的求值顺序没有被指定,甚至比这更差:例如在f(g(h()),i())中,这是可能的呼叫序列将是h,i,g,f.

评估订单的保证也仅适用于内置运算符;如果您重新定义它们,那么它们基本上成为函数调用,其中参数的求值顺序不能保证,并且不执行短路.

其他二进制运算符不能保证评估的顺序,例如一个常见的错误是在:

std::cout << foo() << bar();

对foo()的调用保证在调用bar()之前发生…这不是真的.

当然,三元评价的顺序也是有保证的:运算符,其中只有其中一个其他表达式将在首先评估条件后进行评估.

评估顺序得到保证的另一个地方(有时候对新手来说有些令人惊讶)是构造函数的成员初始化列表,但在这种情况下,顺序不是表达式中的顺序,而是类中成员声明的顺序… . 例如:

struct Foo
{
   int x,y;
   Foo() : y(compute_y()),x(compute_x()) {}
};

在这种情况下,可以保证在调用compute_y()之前调用compute_x(),因为x在成员声明中先于y.

原文链接:https://www.f2er.com/c/116589.html

猜你在找的C&C++相关文章