Присваивание логического И + в C ++, безопасно?

Я только что изучил этот отличный шаблон (на самом деле из javascript) и хотел бы применить его к своему коду на C ++.

Чтобы объяснить шаблон, скажем, я представляю строку как связанный список из них:

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

Обратите внимание, что последний символ любой строки link_char всегда будет иметь код == 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);

Будут ли операции такого типа работать как задумано на разных платформах? Я читал, что «если вы дважды прочитаете переменную в выражении, в которое вы также ее записываете, результат не определен». Но интуитивно я чувствую, что короткое замыкание гарантирует порядок, не так ли?

10
задан cmeub 1 July 2011 в 05:56
поделиться