Что делает оператор запятой?
-
02-07-2019 - |
Вопрос
Что делает следующий код на 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
без каких-либо если вообще.