我需要初始化一个变量并测试它的值。最有效的方法是什么?
char *key = get_key(item);
if (key != NULL) { // do something }
或者
char *key;
if (key = get_key(item)) { // do something }
副作用是否会产生一些优势?谢谢!
我需要初始化一个变量并测试它的值。最有效的方法是什么?
char *key = get_key(item);
if (key != NULL) { // do something }
或者
char *key;
if (key = get_key(item)) { // do something }
副作用是否会产生一些优势?谢谢!
啊,好“最有效的方式”......不。不。忘记效率。
即使存在差异,这也很可能是过早的优化。但是在这种特殊情况下,唯一的区别在于术语(从技术上讲,您的第二个示例不是初始化,而是赋值表达式),并且您的编译器几乎肯定会从两段代码中生成完全相同的汇编程序。
在你的简单程序中,要问的问题是:你会重用分配吗?分配的成本将是一个内存存储。如果根本不使用,那么我就不会增加商店的成本。无论如何,编译器可能正在这样做,但帮助它并没有什么坏处:-)
如果您确实打算重用密钥,那么我个人不喜欢在 if() 中而不是在声明步骤中这样做以提高可读性。所以,我会做第二种方式,但不要让分配在 if() 之外。
问问自己效率是否重要。(答案:极不可能)
追求可读性。考虑到这一点,在 if 条件内进行赋值是有问题的,所以我强烈喜欢第一个版本。
对于您的具体示例,可能没有区别。构建两者并比较生成的代码以进行检查。
两个代码片段在行为上是等效的。
我个人不喜欢第二个,因为if
语句控制表达式中的副作用往往会降低代码的可读性,尤其是当副作用是通过赋值产生时。顺便说一句,这就是为什么像 Python 这样的语言禁止在语句的控制表达式中使用赋值运算符的原因之一(容易出错)if
。
话虽如此,我也不喜欢初始化时的副作用(第一个代码片段中声明中的函数调用)。
一个独立的声明 ( char *key;
) 根本不产生任何代码,因此两个代码片段很可能会生成相同的代码,但可以说第一个片段更容易阅读。