Подтвердить что ты не робот

Почему этот код на С++ компилируется? Что оно делает?

У меня возникла эта проблема, когда я случайно удалил имя метода. Код перешел из

bool bRet = MethodName(pData, pOutFilename);

к

bool bRet = (pData, pOutFilename);

но все еще скомпилирован? Что делает этот код? Что это значит? Кажется, что возвращает true, всегда ли это так (даже если pData является нулевым)?

Любые идеи приветствуются!

4b9b3361

Ответ 1

это оператор запятой, который

оценивает свой первый операнд и отбрасывает результат, а затем оценивает второй операнд и возвращает это значение (и тип).

Ответ 2

Ваше выражение 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

Чтобы понять результат: посмотреть таблицу приоритетов , имеют более низкий приоритет, чем =. В вашем выражении вы переписываете приоритет, используя скобки.

Ответ 3

Его , оператор запятой. Если у вас есть выражение вроде этого:

i = (a, b);        

b будет сохранен в i.

Итак, в вашем случае:

bRet = pOutFilename;

pOutFilename будет сохранен в bRet.