逗号运算符是做什么的?
以下代码在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
根本没有。