1

是否有可能实现一个 if 来检查 -1 并且如果不是负 -1 而不是分配值。但是不必调用该函数两次?或将返回值保存到局部变量。我知道这在汇编中是可能的,但是有交流实现吗?

int i, x = -10;
if( func1(x) != -1) i = func1(x);
4

4 回答 4

2

将返回值保存到局部变量

以我的经验,避免局部变量很少值得失去清晰度。大多数编译器(大部分时间)通常可以避免相应的加载/存储,而只为这些本地变量使用寄存器。所以不要逃避,拥抱它!被保留的维护者的理智可能是你自己的。

我知道这在汇编中是可能的,但是有交流实现吗?

如果事实证明您的情况是实际适合汇编的情况,请在头文件中声明并链接到汇编例程。

建议:

const int x = -10;
const int y = func1(x);
const int i = y != -1
            ? y
            : 0 /* You didn't really want an uninitialized value here, right? */ ;
于 2013-02-26T03:18:33.120 回答
1

这取决于 func1 是否产生任何副作用。以 rand() 或 getchar() 为例。连续两次调用这些函数可能会导致不同的返回值,因为它们会产生副作用;rand() 更改种子,getchar() 使用标准输入中的字符。也就是说,通常会rand() == rand()1评估为假,并且无法可靠地预测。假设 func1 要产生副作用,对于具有相同输入的连续调用,返回值可能不同,因此可能评估为假。getchar() == getchar()func1(x) == func1(x)

如果 func1 没有产生任何副作用,并且输出仅基于输入是一致的,那么我看不出你为什么不解决int i = func1(x);,并且基于是否的逻辑i == -1。编写最少重复的代码可以提高易读性和可维护性。如果您担心这样做的效率,请不要担心。您的编译器很可能足够聪明,可以消除死代码,因此它可以很好地将其转换为相当有效的代码。

1. ...至少在任何理智的标准库实现中。

于 2013-02-26T07:10:53.970 回答
0

我能想到的最好的实现是:

int i = 0; // initialize to something
const int x = -10;
const int y = func1(x);

if (y != -1)
{
  i = y;
}

const 会让编译器进行它认为最好的任何优化(可能是内联 func1)。注意 func 只被调用一次,这可能是最好的。const y 还允许将 y 保存在一个寄存器中(无论如何它都需要它来执行 if)。如果您想提供更多建议,您可以这样做:

register const int y = func1(x);

但是,编译器不需要遵守您的 register 关键字建议,因此最好将其排除在外。

根据布莱恩的回答进行编辑:

int i = ((func1(x) + 1) ?:0) - 1;

顺便说一句,我可能不建议使用它,但它确实回答了这个问题。这是基于这里的 SO 问题。对我来说,我仍然对这个问题的原因感到困惑,这似乎更像是一个谜题或工作面试问题,而不是在“真实”程序中遇到的问题?我当然想听听为什么需要这样做。

于 2013-02-26T03:23:24.183 回答
0
int c;
if((c = func1(x)) != -1) i = c;
于 2013-02-26T03:12:48.650 回答