Синтаксис C / C ++ - Разделение операторов вместо;законно? - PullRequest
7 голосов
/ 16 ноября 2011

Я только что наткнулся на этот кусок кода, который делает это:

delete a, a = 0;

Он компилируется и работает просто отлично.Но разве это не должно быть:

delete a;
a = 0;

Почему разделение операторов с использованием, разрешено в этом случае?

Спасибо:)

Ответы [ 5 ]

7 голосов
/ 16 ноября 2011

В C и C ++ большинство «операторов» на самом деле являются выражениями. Точка с запятой, добавленная к выражению, превращает его в выражение. В качестве альтернативы разрешается (но почти всегда плохой стиль) разделять выражения с побочными эффектами с помощью оператора запятой: выражение левой стороны оценивается на предмет его побочных эффектов (и его значение отбрасывается), а правое - выражение стороны оценивается по его значению.

6 голосов
/ 16 ноября 2011

Это запятая. Он оценивает оба аргумента и возвращает второй.

5 голосов
/ 16 ноября 2011

То есть оператор запятой . Статья MSDN здесь . И посмотрите на этот вопрос, чтобы понять, как он работает.

5 голосов
/ 16 ноября 2011

Это оператор запятой. Он может использоваться для разделения выражений, но не объявлений.

1 голос
/ 16 ноября 2011

Хотя можно написать такой код, это может быть несколько странно. Несколько более реалистичный вариант использования будет, если у вас есть структура T следующим образом:

struct T {
    bool check() const;
    void fix();
};

Теперь вы хотите перебрать все в структуре и запустить проверку, а затем вызвать fix, если check возвращает false. Простой способ сделать это будет

for (list<T>::iterator it = mylist.begin(); it < mylist.end(); ++it)
     if (!it->check())
         it->fix();

Давайте представим, что вы хотите написать это как можно короче. fix() возврат пустоты означает, что вы не можете просто привести его в состояние. Однако, используя оператор запятой, вы можете обойти это:

for (auto it = mylist.begin(); it != mylist.end() && (it->check() || (it->fix(), true)); ++it);

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

...