当前位置: 首页 > 知识库问答 >
问题:

理解(void)放在函数调用前面的作用

拓拔俊艾
2023-03-14

我的问题是:

为什么< code>(void)负责返回不同的值?到底发生了什么?

struct S {
  int operator,(int) { return 0; }
};
std::cout << (S(), 42) << '\n';           // prints '0'
std::cout << ((void) S(), 42) << '\n';    // prints '42'

共有3个答案

费辰阳
2023-03-14

在第二条语句中需要注意的重要一点是,强制转换比逗号运算符具有更高的优先级。这意味着表达式((void)S(),42)实际上由于运算符优先级而被分组为(或等效于编写)(((void)S()),42)

因此,在第二种情况下,临时的S()首先被强制转换为void,因此结果类型是void。现在,由于自定义重载的S::运算符(int)不再可行(因为它需要类型Sint的参数),内置的运算符,将与类型为void(从您使用的情况返回)和42的操作数一起使用,它将返回最右边的操作数42。因此第二个语句print42

岳嘉容
2023-03-14

(void)正在执行显式转换(到void)。

对于第1种情况,S(),42S::运算符,将在临时S(即S()

对于第二种情况,临时S被显式转换为void,因此对于(void)S(),42将调用内置的逗号运算符,因为效果是第二个操作数42将由逗号运算符返回,然后打印出来。(第一个操作数(void)S()首先被评估,结果被丢弃。)

逗号表达式结果的类型、值和值类别正好是第二个操作数的类型、数值和值类别

庞瀚
2023-03-14

这里的问题是逗号运算符已重载。

所以第一行:

(S(), 42)

将调用此逗号运算符的自定义重载,因为参数是Sint0值。

第二行:

((void) S(), 42)

您自定义的逗号运算符重载与传递的类型不匹配,因为第一个参数是void类型(转换完成)。因此内置版本的逗号运算符开始生效。这意味着将返回第二个参数。这就是为什么在第二行打印42。

附注:

    < li >是的,C允许您重载逗号运算符,但这种情况并不常见,通常被视为一种不好的做法。在许多编码标准中,这是被禁止的。
 类似资料:
  • 我是一个C的初学者,我想使用一个具有空函数的空函数作为传递的参数,然后我想用递归的方式调用它。例如但是很明显,我不能使用它,因为参数没有返回类型。有人对如何递归调用它有什么建议吗?谢谢!

  • 尾部调用优化对返回void的函数的递归调用有效吗?例如,我有一个函数,void fun() 在这里,编译器不会知道,调用fun()是最后一条语句。那么尾部调用优化是否只针对返回某些值的函数?

  • 本文向大家介绍理解javascript回调函数,包括了理解javascript回调函数的使用技巧和注意事项,需要的朋友参考一下 把函数作为参数传入到另一个函数中。这个函数就是所谓的回调函数 经常遇到这样一种情况,某个项目的A层和B层是由不同的人员协同完成.A层负责功能funA,B层负责funcB。当B层要用到某个模块的数据,于是他对A层人员说,我需要你们提供满足某种需求的数据,你给我提供一个接口。

  • 二.背景 我正在使用C代码库为Android开发一个实时通信应用程序。我使用SWIG生成一个JNI桥,以从Java访问本机代码。为了跟踪正在进行的通话,将用作句柄(指向包含正在进行的通话信息的地址)。以下函数头是如何使用它的示例:

  • 问题内容: 如何调用函数列表并使用列表推导? 我知道我能做 但是我可以在下面做吗? 如果我的函数列表在课堂上,那么对于那些善良的人们来说,还有一个问题 它有效吗? 问题答案: 当然,您可以按照FábioDiniz所说的:)进行操作,但是对于将类方法用作可调用对象时,必须将其作为参数提供给对象: 该对象必须作为可调用对象的参数提供,因为当您查看方法的定义时,该方法需要一个参数“ self ”

  • 问题内容: 在条件语句中评估函数值时,调用函数的正确方法是什么? 这将返回错误: 您将如何在Go中编写此代码? 问题答案: 您忘记了声明一个返回值。它应该是: