Почему этот код компилируется в VS? («лишняя» запятая) - PullRequest
2 голосов
/ 12 апреля 2011

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

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

Ответы [ 2 ]

7 голосов
/ 12 апреля 2011

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

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

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

1 голос
/ 12 апреля 2011

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

...