Вопрос

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

if (blah(), 5) {
    //do something
}
Это было полезно?

Решение

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

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


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

Другие советы

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

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;
}

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

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

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

class PlaceHolder
{
};

PlaceHolder Blah() { return PlaceHolder(); }

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

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

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

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

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

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

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

FIND_SOMETHING(X) (x>2) ?найди_фрукты(x) :find_houses(x) найти дома (x)

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

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

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

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

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

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

blah();
// do something

без каких-либо если вообще.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top