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

返回void的函数的无序函数求值

邵博艺
2023-03-14

C和C中有没有办法让返回void的函数按照未指定的顺序求值?

我知道函数参数是按未指定的顺序计算的,因此对于不返回void的函数,这可用于以未指定的顺序计算这些函数:

#include <stdio.h>

int hi(void) {
    puts("hi");
    return 0;
}

int bye(void) {
    puts("bye");
    return 0;
}

int moo(void) {
    puts("moo");
    return 0;
}

void dummy(int a, int b, int c) {}

int main(void) {
    dummy(hi(), bye(), moo());
}

合格编译器编译的合法C和C代码可以按任何顺序打印< code>hi 、< code>bye和< code>moo。这并不是未定义的行为(鼻魔是无效的),有效的输出不止一个,但不一定是无限的,一个兼容的编译器甚至不需要确定它产生了什么。

有没有办法在没有伪返回值的情况下实现这一点?

澄清:这是一个关于C和C的抽象问题。一个更好的原始措辞可能是:对于返回void的函数,有没有不指定函数求值顺序的上下文?我不是要解决一个特定的问题。

共有2个答案

宗啸
2023-03-14

总是有一种显而易见的方法,将指向容器中函数的指针放入容器中,将其无序排列(或者按照注释中的建议进行排序),然后调用容器中的每个项。如果每次跑步都需要相同的行为,只需确保每次的种子都相同即可。

陆英毅
2023-03-14

您可以利用这样一个事实,即逗号运算符的左侧是一个被丢弃的值表达式(C中的空表达式),如下所示(实时查看):

int main(void) {
    dummy((hi(),0), (bye(),0), (moo(),0));
}

从草案C标准部分5.18逗号运算符:

由逗号分隔的一对表达式从左到右求值;左边的表达式是一个废弃的值表达式(第5条)。

和C11节6.5.17逗号运算符:

逗号运算符的左操作数被评估为无效表达式;它的评估和右操作数的评估之间有一个序列点。然后对右操作数进行评估;结果有它的类型和值。

正如Matt指出的,也可以将上述方法与算术运算符混合,以实现未指定的评估顺序:

(hi(),0) + (bye(),0) + (moo(),0) ;
 类似资料:
  • 我正在学习指针是如何工作的,但我不明白这段代码中的一件事。在void*函数中返回int就像一个咒语,但是返回float就不是了。

  • 我在玩C语言中的函数指针只是为了学习。我尝试调用一个空函数,并将其结果设置为int。 我从中得到的结果是: 在对它进行了一点研究之后,我意识到main正在函数()中打印printf语句中的字符数。为什么会这样?这是预期产出吗?

  • 问题内容: 我是一名编程初学者,对函数的返回值有疑问。 我正在学习Java。 我已经附上了我的书中具有经典选择排序功能的代码。 现在显然来自本书的代码可以正常工作。但是,主要功能中的以下三行是我的问题的基础: int [] a = new int [] {1,9,2,8,3,7,4,6​​,5}; 排序(a); if(ascending(a))System.out.println(“ Works”

  • 问题内容: 我有一个返回类对象或nil的函数。该功能的目的是检查是否存在。聊天ID存储在MySQL中。如果ID存在,则执行Firebase引用以获取快照,然后获取对象。如果ID不存在,则返回nil: 但是,在我得到 void函数中非预期的非无效返回值。 关于我可能会想念的任何想法? 问题答案: 问题是您试图从一个封闭内部返回一个非空值,该值仅从封闭内部返回,但是由于该封闭期望一个空返回值,因此您会

  • 在rust中,任何函数都有返回类型,当函数返回时,会返回一个该类型的值。我们先来看看main函数: fn main() { //statements } 之前有说过,函数的返回值类型是在参数列表后,加上箭头和类型来指定的。不过,一般我们看到的main函数的定义并没有这么做。这是因为main函数的返回值是(),在rust中,当一个函数返回()时,可以省略。main函数的完整形式如下:

  • 有没有可能创建一个函数,它将lambda函数作为参数(每个lambda函数使用参数),然后返回一个具有单个参数的新函数,并返回所有lambda函数的乘积? 以下是我的非工作示例: 所以本质上,你有一个函数,它需要4个lambda函数,每个函数使用参数。例如,的参数可以类似于。 然后返回一个名为的新函数,该函数的输出是所有lambda函数的乘积,并且有一个参数,该参数传递到的每个lambda函数的参