逗号运算符是做什么的?

以下代码在C / C ++中做了什么?

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

使用逗号运算符,并使用值5来确定条件的真/假。

它将执行blah()并返回(大概是),然后使用逗号运算符,并且5将是唯一用于确定expression式的真/假值的东西。


请注意,运算符可能被重载为blah()函数的返回types(未指定),从而导致结果不明显。

如果逗号运算符没有超载,则代码与此类似:

 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()。

在一个更广泛的答案。 逗号运算符(非重载)按照parsing,执行第一部分并返回第二部分。

所以,如果你有(foo(),bar())这两个函数将被执行,但expression式的值计算为bar()(以及expression式的types)。

虽然我不会说这里有公平的用法,但通常认为读取代码有点困难。 主要是因为没有多less种语言共享这样的结构。 所以作为一个个人经验法则,我会避免它,除非我将代码添加到一个先前存在的expression式,并且不想完全改变它的格式。

例如:我有一个macros(不讨论是否应该使用macros,有时甚至不是你写的)

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

我通常在作业中使用它,如my_possession = FIND_SOMETHING(34);

现在我想添加日志到它的debugging目的,但我不能改变查找function。 我可以 :

FIND_SOMETHING(X)(x> 2)? (LOG(“寻找水果”),find_fruits(x)):( LOG(“寻找房屋”),find_houses(x))

我有时使用这样的结构进行debugging。 当我强迫如果接近真的不pipe回报价值的话。 很明显,它不应该出现在生产代码中。

下面的代码是假设它是C代码,或者在C文件中,或者在C ++文件的C代码块中:

这是毫无意义的。 它会调用blah(),但是blah()的结果根本不被考虑。 唯一考虑的是5,因此,如果总是评估为真。 IOW你可以写这个代码

 blah(); // do something 

根本没有。