是否可以实现if检查-1,如果不是负-1则分配值。但是不必两次调用该函数?或将返回值保存到局部变量。我知道这在汇编中是可行的,但有没有c实现?
int i, x = -10;
if( func1(x) != -1) i = func1(x);
答案 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。对我来说,我仍然对这个问题的原因感到困惑,这似乎更像是一个谜题或工作面试问题而不是“真实”程序中会遇到的问题?我当然想知道为什么需要这样做。