Ответ 1
это оператор запятой, который
оценивает свой первый операнд и отбрасывает результат, а затем оценивает второй операнд и возвращает это значение (и тип).
У меня возникла эта проблема, когда я случайно удалил имя метода. Код перешел из
bool bRet = MethodName(pData, pOutFilename);
к
bool bRet = (pData, pOutFilename);
но все еще скомпилирован? Что делает этот код? Что это значит? Кажется, что возвращает true, всегда ли это так (даже если pData является нулевым)?
Любые идеи приветствуются!
это оператор запятой, который
оценивает свой первый операнд и отбрасывает результат, а затем оценивает второй операнд и возвращает это значение (и тип).
Ваше выражение bool bRet = (pData, pOutFilename);
является допустимым выражением и эквивалентно выражению bool bRet = pOutFilename;
В bool bRet = (pData, pOutFilename);
оценивается первое выражение pData
, затем вычисляется второе выражение pOutFilename
, тогда значение второго выражения присваивается bRet
(это как оператор ,
работает от left-to -Верно).
Читайте: Comma Operator: ,
Оператор запятой
,
имеетleft-to-right associativity
. Два выражения разделенные запятой, оцениваются слева направо. Левый операнд всегда оценивается, и все побочные эффекты завершаются до операнд оценивается.
Чтобы понять важность скобки ( )
в вашем выражении, рассмотрите мой пример ниже. Соблюдайте вывод в этом примере (например, C):
int main () {
int i = 10, b = 20, c= 30;
i = b, c; // i = b
printf("%i\n", i);
i = (b, c); // i = c
printf("%i\n", i);
}
вывод:
20
30
Чтобы понять результат: посмотреть таблицу приоритетов ,
имеют более низкий приоритет, чем =
. В вашем выражении вы переписываете приоритет, используя скобки.
Его ,
оператор запятой. Если у вас есть выражение вроде этого:
i = (a, b);
b
будет сохранен в i
.
Итак, в вашем случае:
bRet = pOutFilename;
pOutFilename
будет сохранен в bRet
.