是否有可能实现一个 if 来检查 -1 并且如果不是负 -1 而不是分配值。但是不必调用该函数两次?或将返回值保存到局部变量。我知道这在汇编中是可能的,但是有交流实现吗?
int i, x = -10;
if( func1(x) != -1) i = func1(x);
是否有可能实现一个 if 来检查 -1 并且如果不是负 -1 而不是分配值。但是不必调用该函数两次?或将返回值保存到局部变量。我知道这在汇编中是可能的,但是有交流实现吗?
int i, x = -10;
if( func1(x) != -1) i = func1(x);
将返回值保存到局部变量
以我的经验,避免局部变量很少值得失去清晰度。大多数编译器(大部分时间)通常可以避免相应的加载/存储,而只为这些本地变量使用寄存器。所以不要逃避,拥抱它!被保留的维护者的理智可能是你自己的。
我知道这在汇编中是可能的,但是有交流实现吗?
如果事实证明您的情况是实际适合汇编的情况,请在头文件中声明并链接到汇编例程。
建议:
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? */ ;
这取决于 func1 是否产生任何副作用。以 rand() 或 getchar() 为例。连续两次调用这些函数可能会导致不同的返回值,因为它们会产生副作用;rand() 更改种子,getchar() 使用标准输入中的字符。也就是说,通常会rand() == rand()
1评估为假,并且无法可靠地预测。假设 func1 要产生副作用,对于具有相同输入的连续调用,返回值可能不同,因此可能评估为假。getchar() == getchar()
func1(x) == func1(x)
如果 func1 没有产生任何副作用,并且输出仅基于输入是一致的,那么我看不出你为什么不解决int i = func1(x);
,并且基于是否的逻辑i == -1
。编写最少重复的代码可以提高易读性和可维护性。如果您担心这样做的效率,请不要担心。您的编译器很可能足够聪明,可以消除死代码,因此它可以很好地将其转换为相当有效的代码。
1. ...至少在任何理智的标准库实现中。
我能想到的最好的实现是:
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 问题。对我来说,我仍然对这个问题的原因感到困惑,这似乎更像是一个谜题或工作面试问题,而不是在“真实”程序中遇到的问题?我当然想听听为什么需要这样做。
int c;
if((c = func1(x)) != -1) i = c;