下面的C/C++代码是做什么用的?
if (blah(), 5) {
//do something
}
下面的C/C++代码是做什么用的?
if (blah(), 5) {
//do something
}
逗号运算符被应用,值为5用于确定条件语句的真/假。
它将执行blah()函数并返回一些东西(可能是),然后使用逗号运算符,只有值为5的内容被用于确定表达式的真/假值。
请注意,逗号运算符可能会被重载为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;
}
(经过编辑以展示逗号运算符重载场景。感谢David Pierre对此进行评论)
在病态情况下,它取决于逗号操作符的执行方式...
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) ? find_fruits(x) : find_houses(x)
我通常在赋值中使用它,例如my_possession = FIND_SOMETHING(34);
现在我想为其添加日志以进行调试,但我不能更改查找函数。我可以这样做:
FIND_SOMETHING(X) (x>2)? (LOG("looking for fruits"),find_fruits(x)):(LOG("looking for houses"),find_houses(x))
我有时会使用这样的结构来进行调试。当我强制 if 语句无论 blah 的返回值都为 true 时,以便进行调试。显然,这种结构永远不应出现在生产代码中。
以下内容假定是C代码,可以是C文件中的代码或者C++文件中的C块:
这是一个无意义的if语句。它会调用blah()函数,但是blah()函数的结果并没有被if语句考虑到。唯一被考虑的是数字5,因此这个if语句总是会被评估为true。也就是说,你可以将这段代码写成:
blah();
// do something
完全没有任何if。