[挑战]还有比我这个更短更好的swap方法吗
C# code
namespace test
{
using System;
class Program
{
static void Main(string[] args)
{
int a, b;
a = 100;
b = 3;
b = a + 0 * (a = b);
Console.WriteLine(a + "," + b);
}
}
}
今天突然想到的,在网上搜了半天没发现同样的,和其他的一些方法比了一下,我觉得我这个是最优的了,最起码从效率上毫无疑问是最优的,看IL就知道
C# code
//000011: b = a + 0 * (a = b);
IL_0005: ldloc.0
IL_0006: ldloc.1
IL_0007: stloc.0
IL_0008: stloc.1
没有运算,只有赋值
反汇编也差不多,
Assembly code
b = a + 0 * (a = b);
0000002f mov eax,dword ptr [ebp-8]
00000032 mov dword ptr [ebp-10h],eax
00000035 mov eax,dword ptr [ebp-0Ch]
00000038 mov dword ptr [ebp-8],eax
0000003b mov eax,dword ptr [ebp-10h]
0000003e mov dword ptr [ebp-0Ch],eax
------解决方案-------------------- 确实很简单啊!
如果是我可能就多写了a=b,这一步赋值
------解决方案-------------------- 我觉得多加一个中间变量可读性会好一些
------解决方案-------------------- 强憾。
------解决方案-------------------- 不错。
------解决方案-------------------- 不错。
------解决方案-------------------- 这个我很早以前看过,
主要是依赖编译器的编译规则
------解决方案-------------------- C# code
int a, b;
a = 100;
b = 3;
a^=b;
b^=a;
a^=b;
------解决方案-------------------- 不错,但是可读性不太好。
------解决方案-------------------- 探讨 C# code namespace test { using System; class Program { static void Main(string[] args) { int a, b; a = 100; b = 3; ……
------解决方案--------------------
------解决方案-------------------- 强人年年有。。不是数字就了。。
------解决方案-------------------- 你看的懂吗 别人看的懂吗
------解决方案-------------------- mov eax,a xchg eax,b mov a,eax
------解决方案-------------------- lz你把编译器优化关了再看看il?
------解决方案-------------------- 我只是过来看看,我不说话
------解决方案-------------------- “b = a + 0 * (a = b);”这句话会因编译器而异的吧?
------解决方案-------------------- 我没看懂 你们在讨论什么呀?
------解决方案-------------------- 这个绝对不是高效,顶多算是短小。
------解决方案-------------------- 别停留在c的阶段了~~你要快的话,下面这个快~~~C# code
int newa, newb;
for (int i = 0; i < 10000000; i++)
{
newa = b;
newb = a;
}