Почему этот код компилируется в VS? ("лишняя" запятая)

Строка ниже находится внутри цикла for. Если метод терпит неудачу, он должен сломаться. CATEGORY_1 - это перечисление. Я добавил это перечисление в качестве нового параметра в метод AddToList со значением по умолчанию. Если вы посмотрите внимательно ниже, я фактически допустил ошибку, поставив запятую и перечисление за пределы списка параметров функции. Это прекрасно компилируется с VS2010. Поэтому я с трудом обнаружил, что для этого параметра передается значение по умолчанию вместо CATEGORY_1. Кто-нибудь знает, почему это удается?

if (! AddToList(obj1, (unsigned int) Val), CATEGORY_1)
{
    break;
}

2 ответа

Решение

В C++ запятая - это не просто разделитель; это также может быть оператор. Эта запятая является оператором. Оператор запятой оценивает первое выражение, отбрасывает результат, затем оценивает второе выражение и выдает его результат.

!AddToList(obj1, (unsigned int) Val) , CATEGORY_1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^
First expression                       Second expression

[Конечно, оператор запятой, как и большинство других операторов, может быть перегружен, и если здесь используется перегрузка, семантика может быть другой. Это поведение встроенного оператора запятой.]

Оператор запятой просто отбрасывает результат первого выражения и оценивает значение второго выражения. Так что в этом случае, если bool(CATEGORY_1) == true тогда if никогда бы не оценил; наоборот, если bool(CATEGORY_1) == false тогда if всегда будет оценивать. В любом случае это не имеет значения, что AddToList вернулся.

Другие вопросы по тегам