一点魔法


20

挑战

给定以下C#方法:

private static bool Test(bool a, bool b)
{
    if (a && b) return false;
    if (a) if (b) return true;
    return false;
}

提供值ab以便true返回。

获奖条件

可以提供正确参数以使给定方法评估为true胜利的第一个条目。


4
欢迎来到PPCG!这里的所有挑战都需要一个客观的获胜标准,以便如果有多个参赛作品,则可以选择获胜者。似乎这里可能只有一个解决方案,所以此挑战可能不太适合PPCG。对于未来的挑战,让我推荐一个沙盒,您可以在其中获得反馈,然后再进行挑战。
Martin Ender

2
关于是否有没有其他获胜标准的编程难题是否在主题上进行了元讨论,讨论的答案相互矛盾。当问题尚未解决时,我宁愿将问题悬而未决,所以我投票决定重新开放。如果您有意见,请为讨论提供帮助。
xnor

2
@DenkerAffe我认为这四个明显的参数组合都不起作用。
Martin Ender

3
假设有一个有效的答案,这是一个很好的问题,无论它是否符合我们通常对topic。+ 1的考虑。我认为我们通常不考虑这样的问题的原因之一是,我看到的其他所有类似问题都是由初学者提出的,而且答案显而易见。
水平河圣

5
@Widi,这就是为什么“第一个有效的解决方案”可能不是最佳主意的原因。您可能会得到一个无趣但可行的解决方案,该解决方案通过反射使其内部有些混乱,因此没有任何动力去寻找没有反射的更有趣的解决方案。
Martin Ender

Answers:


20
static void Main(string[] args)
{
    bool a, b;
    unsafe
    {
        int* pa = (int*)&a;
        int* pb = (int*)&b;
        *pa = 1;
        *pb = 2;
    }

        Console.Write(Test(a, b));
}

True是通过Visual Studio 2015附带的C#实现为我打印的。我实际上不知道任何C#,但是我认为我会尝试编写一些C代码,看看它是否有效。我希望编译器假定True始终表示为1并使用按位与。在调试模式下,确实是这种情况(它也与Release一起使用)。它对第一个条件使用按位与,对第二个条件使用两个与零的比较:

            if (a && b) return false;
002C2E92  movzx       eax,byte ptr [ebp-3Ch]  
002C2E96  movzx       edx,byte ptr [ebp-40h]  
002C2E9A  and         eax,edx  
002C2E9C  and         eax,0FFh  
002C2EA1  mov         dword ptr [ebp-44h],eax  
002C2EA4  cmp         dword ptr [ebp-44h],0  
002C2EA8  je          002C2EB2  
002C2EAA  xor         edx,edx  
002C2EAC  mov         dword ptr [ebp-48h],edx  
002C2EAF  nop  
002C2EB0  jmp         002C2EE4  
            if (a) if (b) return true;
002C2EB2  movzx       eax,byte ptr [ebp-3Ch]  
002C2EB6  mov         dword ptr [ebp-4Ch],eax  
002C2EB9  cmp         dword ptr [ebp-4Ch],0  
002C2EBD  je          002C2EDC  
002C2EBF  movzx       eax,byte ptr [ebp-40h]  
002C2EC3  mov         dword ptr [ebp-50h],eax  
002C2EC6  cmp         dword ptr [ebp-50h],0  
002C2ECA  je          002C2EDC  
002C2ECC  mov         eax,1  
002C2ED1  and         eax,0FFh  
002C2ED6  mov         dword ptr [ebp-48h],eax  
002C2ED9  nop  
002C2EDA  jmp         002C2EE4  
            return false;
002C2EDC  xor         edx,edx  
002C2EDE  mov         dword ptr [ebp-48h],edx  
002C2EE1  nop  
002C2EE2  jmp         002C2EE4  
        }
002C2EE4  mov         eax,dword ptr [ebp-48h]  
002C2EE7  lea         esp,[ebp-0Ch]  
002C2EEA  pop         ebx  
002C2EEB  pop         esi  
002C2EEC  pop         edi  
002C2EED  pop         ebp  
002C2EEE  ret  

惊人!我完全确定它无法完成
edc65 '16

我尝试过同样的事情,但在Linux下的Mono中似乎无法使用。
jimmy23013 '16

这将不依赖于C#编译器(当前来自MS的Roslyn),而是依赖于JIT编译器(当前来自MS的RyuJIT)。尽管由C#编译器生成的IL也可能影响JIT的功能。
鲍勃
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.