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

Что делает оператор запятой?

Что делает следующий код в C/С++?

if (blah(), 5) {
    //do something
}
4b9b3361

Ответ 1

Применяется Comma-оператор, а значение 5 используется для определения условного истинного/ложного.

Он выполнит blah() и получит что-то обратно (предположительно), тогда используется оператор запятой, а 5 будет единственным, что используется для определения значения true/false для выражения.


Обратите внимание, что оператор operator может быть перегружен для возвращаемого типа функции blah() (который не был указан), что делает результат неочевидным.

Ответ 2

Если оператор запятой не перегружен, код похож на следующий:

blah();
if (5) {
  // do something
}

Если оператор запятой перегружен, результат будет основан на этой функции.

#include <iostream>
#include <string>

using namespace std;

string blah()
{
    return "blah";
}

bool operator,(const string& key, const int& val) {
    return false;
}

int main (int argc, char * const argv[]) {

    if (blah(), 5) {
        cout << "if block";
    } else {
        cout << "else block";
    }

    return 0;
}

(отредактирован, чтобы показать сценарий перегрузки операторов запятой. спасибо Дэвиду Пьеру за комментирование)

Ответ 3

Я знаю одно, что этот код должен делать: он должен запустить кодер. Я был бы немного боюсь работать рядом с тем, кто пишет так.

Ответ 4

В патологическом случае это зависит от того, что делает запятый оператор...

class PlaceHolder
{
};

PlaceHolder Blah() { return PlaceHolder(); }

bool operator,(PlaceHolder, int) { return false; }

if (Blah(), 5)
{
    cout << "This will never run.";
}

Ответ 5

Я бы сказал, что это зависит от blah().

Ответ 6

Об более широком ответе. Оператор запятой (без перегрузки) разрешается, как и в, выполняет первую часть и возвращает вторую часть.

Итак, если у вас есть (foo(), bar()) Обе функции будут выполняться, но значение выражения оценивается как bar() (и тип выражения).

Пока я не буду говорить, что для этого есть справедливое использование, обычно считается, что читать код очень сложно. В основном потому, что не многие языки разделяют такие конструкции. Поэтому, как личное эмпирическое правило, я избегаю этого, если не добавляю код в предсуществующее выражение и не хочу полностью изменять его формат.

Пример: у меня есть макрос (не обсуждать, следует ли использовать макросы или нет, иногда даже его не написано)

FIND_SOMETHING (X) (x > 2)? find_fruits (x): find_houses (x)

И я обычно использую его в назначениях, таких как my_possession = FIND_SOMETHING (34);

Теперь я хочу добавить к нему журнал для целей debuggin, но я не могу изменить функции find. Я мог бы сделать:

FIND_SOMETHING (X) (x > 2)? (LOG ( "ищет фрукты" ), find_fruits (x)):( LOG ( "ищет дома" ), find_houses (x))

Ответ 7

Ниже было написано, что это код C, либо в файле C, либо в блоке C файла С++:

Это бессмысленно, если. Он будет называть blah(), однако результат blah() не рассматривается, если вообще. Единственное, что считается 5, значит, if всегда будет оценивать true. IOW, вы можете написать этот код как

blah();
// do something

без каких-либо ограничений.

Ответ 8

Я использую иногда такие конструкции, как это для целей отладки. Когда я принудию, чтобы значение if было истинным независимо от возвращаемого значения blah. Очевидно, что он никогда не должен появляться в производственном коде.