如果 (n!=0) n=0; v/sn=0;哪个更有效,为什么?

if (n!=0) n=0; v/s n=0; Which is more efficient and why?

作为高级程序员输入程序时,n = 0; 看起来更高效、更干净。

但是 n = 0; 真的比 if (n != 0) n = 0; 更有效率吗?

  1. n 更可能是 0

  2. n 不太可能是 0

  3. n绝对不确定。

语言:C (C90)

编译器:Borland 的 Turbo C++

最少的可重现代码

void scanf();

void main()
{
int n; // 2 bytes

n=0; // Expression 1

scanf("%d",&n); // Absolutely uncertain

if(n!=0) n=0; // Expression 2

}

注意:以上代码仅供大家参考。请不要随波逐流

如果您对上述 language/standard/compiler 感到不满意,请随时在您的首​​选 language/standard/compiler.

中解释以上 3 种情况

n = 0;

因为没有条件检查,所以效率会更高。

https://godbolt.org/z/GEzfcD

如果n是2的补码整数类型或者无符号整数类型,那么直接写n = 0肯定不会比带条件检查的版本慢,好的优化编译器会生成相同的代码。一些编译器将赋值编译为零作为寄存器值与自身的异或运算,这是一条指令。

如果n是浮点类型、1s的补码整数类型或带符号的幅度整数类型,则这两个代码片段的行为不同。例如。例如,如果 n 有符号负零。 (确认@chqrlie。)此外,如果 n 是系统上的指针,而不是具有多个空指针表示形式,则 if (n != 0) n = 0; 不会分配 n,而 n 是其中之一各种 空指针 n = 0; 赋予不同的功能。

"will always be more efficient" 不正确。如果读 n 成本低,写 n 成本高(想想重写非易失性存储器需要重写一个页面)并且很可能 n == 0,那么n = 0;if (n != 0) n = 0;.

慢, 效率低