逗号运算符有啥作用?

Posted

技术标签:

【中文标题】逗号运算符有啥作用?【英文标题】:What does the comma operator do?逗号运算符有什么作用? 【发布时间】:2010-09-14 01:14:18 【问题描述】:

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

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

【问题讨论】:

应该指定问题中的语言;即使没有 C 和 C++ 标记,我认为标记也不够。 @jfm3 不是我的作业,但 IRC 频道中的某个人提出了这个问题,我认为这是一个很好的问题@Mark 谢谢,我注意到问题中的语言 “C/C++”不是一种语言。大多数响应者似乎都关注逗号运算符重载,因此 C++。这个问题也许应该重新标记。 【参考方案1】:

假设它是 C 代码,在 C 文件中或在 C++ 文件的 C 块中编写以下代码:

这是一个毫无意义的如果。它将调用 blah(),但是 if 根本不考虑 blah() 的结果。唯一考虑的是 5,因此 if 将始终评估为 true。 IOW 你可以把这段代码写成

blah();
// do something

根本没有任何if

【讨论】:

是的,不幸的是,有人可以让 blah() 返回一个对象,其类已经重载了逗号运算符,然后谁知道会发生什么。逗号运算符可以将某些内容与 5 进行比较并返回 false,完全跳过括号中的代码。 如果是 C++(即使是 C++ 项目也可能在文件列表中有一个纯 C 文件);有一个 C++ 标记,也有一个 C 标记,这也可以在外部“C”块中,在这种情况下,不可能重载。【参考方案2】:

我有时会使用这样的结构来进行调试。当我强制 if close 为真时,不管 blah 的返回值如何。 很明显,它不应该出现在生产代码中。

【讨论】:

【参考方案3】:

关于更广泛的答案。逗号运算符(非重载)解析为,执行第一部分并返回第二部分。

所以如果你有 (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("找水果"),find_fruits(x)):(LOG("找房子"),find_houses(x))

【讨论】:

【参考方案4】:

如果逗号运算符没有重载,代码类似这样:

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 对此发表评论)

【讨论】:

不,C++ 有运算符,这里要考虑 是的 - 忘了你可以覆盖 C++ 中的逗号运算符。我想这就是这个问题的真正意义所在!【参考方案5】:

我知道这种代码应该做的一件事:它应该让编码器被解雇。和这样写的人一起工作,我会有点害怕。

【讨论】:

【参考方案6】:

在病态的情况下,这取决于逗号运算符的作用......

class PlaceHolder

;

PlaceHolder Blah()  return PlaceHolder(); 

bool operator,(PlaceHolder, int)  return false; 

if (Blah(), 5)

    cout << "This will never run.";

【讨论】:

【参考方案7】:

应用逗号运算符,值 5 用于确定条件的真/假。

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


请注意,对于 blah() 函数(未指定)的返回类型,可能会重载 , 运算符,从而使结果不明显。

【讨论】:

有趣的是(至少对我而言),当您重载逗号运算符时,显然无法确保操作的顺序。总的来说,我不认为我会这样做。 让我想起前几天写的一个bug:想写CAnObject a(d, f);但最后写了 CAnObject a = ( d, f );不幸的是,从 f 的类型转换为 CAnObject。啊。【参考方案8】:

我会说这取决于 blah()。

【讨论】:

blah() 将被调用,我们不知道副作用。所以回答“这段代码会做什么?”这个问题。是不可能的。 我同意你的看法,本。没有足够的信息可以肯定地说。 例如异常。或者,如果您更喜欢 c,请转到。

以上是关于逗号运算符有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中赋值运算符有啥作用?

使用逗号运算符在 redux 工具包中的同一调度中调用多个减速器不起作用

js中的逗号运算符

Typescript - 逗号运算符左侧未使用,没有副作用 - 如何在hookrouter的路由中使用常量代替字符串?

c语言 求解逗号表达式的值

C语言中逗号表达式的实用意义或者产生的原因?