Почему этот код компилируется в 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
вернулся.