如果在C&没有双重呼叫的分配

时间:2013-02-26 03:10:03

标签: c if-statement

是否可以实现if检查-1,如果不是负-1则分配值。但是不必两次调用该函数?或将返回值保存到局部变量。我知道这在汇编中是可行的,但有没有c实现?

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

4 个答案:

答案 0 :(得分: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? */ ;

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分: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保存在寄存器中(无论如何它都需要为了执行if)。如果你想提出更多建议,你可以这样做:

register const int y = func1(x);

但是,编译器不需要遵守您的注册关键字建议,因此最好将其删除。

基于BRIAN's ANSWER灵感的编辑:

int i = ((func1(x) + 1) ?:0) - 1;
顺便说一下,我可能不建议使用它,但确实回答了这个问题。这基于SO question here。对我来说,我仍然对这个问题的原因感到困惑,这似乎更像是一个谜题或工作面试问题而不是“真实”程序中会遇到的问题?我当然想知道为什么需要这样做。