2013-02-26 29 views
1

是否有可能实现一个if检查-1,如果不是-1,则分配值。但不必两次调用该函数?或将返回值保存到局部变量。我知道这是可能的汇编,但有一个C实现?如果语句在C&赋值时没有双重调用

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

无论如何,没有函数调用,写入的'i'不确定(即它没有定义的值),所以它有什么关系? 'if((i = func(x))!= -1){/ * use i * /}'和'其他'一样好。 – WhozCraig 2013-02-26 03:14:20

+0

C的较短行并不意味着更快的程序。你需要比较大会,看看是否有任何获得。通常这些类型的“优化”并不是真正的优化,它们只是令人困惑。 – 2013-02-26 03:17:59

+0

@JoshPetitt假设func1执行一些其他副作用,类似于rand。它仍然是一个优化? – Sebivor 2013-02-26 03:52:09

回答

0
int c; 
if((c = func1(x)) != -1) i = c; 
2

返回值保存到一个局部变量

以我的经验,避免局部变量是很不值得没收的清晰度。大多数编译器(大部分时间)通常可以避免相应的加载/存储,并只为那些当地人使用寄存器。所以不要回避它,拥抱它!维护人员的完整性可能是你自己的。

我知道这是可能的程序集,但有没有c实现?

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

建议:

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? */ ; 
+0

也许这是唯一有价值的使用三元运算符(即能够根据比较分配) – 2013-02-26 03:35:51

+0

@JoshPetitt,我认为这可能是我曾经考虑过的唯一用途 - 什么是滥用/误用的例子? – 2013-02-26 03:38:04

+1

当人们使用它们而不是简单的if语句时,因为他们认为它们以某种方式更快,因为它们可以写在一行上。例如,如果我已经有了一个价值。顺便说一句,我不是说你做到了。 – 2013-02-26 03:39:39

0

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

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

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

的常量将让编译器,它认为任何优化是最好的(也许是内嵌FUNC1)。注意func只调用一次,这可能是最好的。常数也允许y保存在一个寄存器中(为了执行if,它将需要无论如何)。如果你想给更多的建议,你可以这样做:

register const int y = func1(x); 

然而,兑现你的register关键字建议编译器不是必需的,所以它可能是最好离开它。

编辑基于鼓励布莱恩的回答是:

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

BTW,我可能不会建议使用此,但它确实回答这个问题。这是基于SO question here。对我而言,我仍然对这个问题的原因感到困惑,它似乎更像是一个难题或求职面试问题,而不是在“真实”计划中遇到的问题?我当然想听听为什么会这样。

1

这取决于func1是否会产生任何副作用。以rand()或getchar()为例。连续调用这些函数可能会导致不同的返回值,因为它们会产生副作用; rand()更改种子,并且getchar()从stdin中消耗一个字符。即rand() == rand()通常 评估为false,并且getchar() == getchar()不能被可靠地预测。假设func1产生副作用,对于具有相同输入的连续调用,返回值可能不同,因此func1(x) == func1(x)可能评估为false。

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

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

+0

(不想争辩),但即使有副作用,也不会int i = func1(x);最有意义?它只调用一次函数?顺便说一句,我完全同意你的第二段,副作用或没有副作用。 – 2013-02-26 12:57:25

+0

@JoshPetitt:假设func1会产生副作用,if(func1(x)== -1){i = func1(x); }'可能会产生两倍于int i = func1(x)的副作用;'...就像if(getchar()!= -1){i = getchar(); }'可能会消耗两倍于'int i = getchar();'的字符。 – Sebivor 2013-02-26 13:03:39

+0

表示同意,这就是为什么我要说func1一次,而不是两次。我了解你对副作用的担忧。 – 2013-02-26 14:23:28