2

我需要初始化一个变量并测试它的值。最有效的方法是什么?

char *key = get_key(item);
if (key != NULL) { // do something }

或者

char *key; 
if (key = get_key(item)) { // do something }

副作用是否会产生一些优势?谢谢!

4

6 回答 6

3

啊,好“最有效的方式”......不。不。忘记效率。

即使存在差异,这也很可能是过早的优化。但是在这种特殊情况下,唯一的区别在于术语(从技术上讲,您的第二个示例不是初始化,而是赋值表达式),并且您的编译器几乎肯定会从两段代码中生成完全相同的汇编程序。

于 2013-07-23T15:49:57.543 回答
2

在你的简单程序中,要问的问题是:你会重用分配吗?分配的成本将是一个内存存储。如果根本不使用,那么我就不会增加商店的成本。无论如何,编译器可能正在这样做,但帮助它并没有什么坏处:-)

如果您确实打算重用密钥,那么我个人不喜欢在 if() 中而不是在声明步骤中这样做以提高可读性。所以,我会做第二种方式,但不要让分配在 if() 之外。

于 2013-07-23T15:50:37.670 回答
0

问问自己效率是否重要。(答案:极不可能)

追求可读性。考虑到这一点,在 if 条件内进行赋值是有问题的,所以我强烈喜欢第一个版本。

于 2013-07-23T15:49:37.713 回答
0

对于您的具体示例,可能没有区别。构建两者并比较生成的代码以进行检查。

于 2013-07-23T15:44:39.180 回答
0

两个代码片段在行为上是等效的。

我个人不喜欢第二个,因为if语句控制表达式中的副作用往往会降低代码的可读性,尤其是当副作用是通过赋值产生时。顺便说一句,这就是为什么像 Python 这样的语言禁止在语句的控制表达式中使用赋值运算符的原因之一(容易出错)if

话虽如此,我也不喜欢初始化时的副作用(第一个代码片段中声明中的函数调用)。

于 2013-07-23T15:57:32.720 回答
0

一个独立的声明 ( char *key;) 根本不产生任何代码,因此两个代码片段很可能会生成相同的代码,但可以说第一个片段更容易阅读。

于 2013-07-23T15:48:11.823 回答