เวทมนตร์บูลเล็กน้อย


20

ท้าทาย

รับวิธี C # ต่อไปนี้:

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

ระบุค่าaและbอื่น ๆ ที่trueส่งคืน

สภาพการชนะ

รายการแรกที่สามารถให้ข้อโต้แย้งที่ถูกต้องเพื่อให้วิธีการที่กำหนดประเมินผลให้trueชนะ


4
ยินดีต้อนรับสู่ PPCG! ความท้าทายทั้งหมดที่นี่ต้องมีเกณฑ์การชนะอย่างมีวัตถุประสงค์เพื่อให้ผู้ชนะสามารถเลือกได้หากมีหลายผลงาน ดูเหมือนว่าอาจมีทางออกเดียวที่นี่ดังนั้นความท้าทายนี้อาจไม่เหมาะสำหรับ PPCG สำหรับความท้าทายในอนาคตให้ฉันแนะนำ sandboxที่คุณสามารถรับข้อเสนอแนะก่อนที่ความท้าทายจะดำเนินต่อไป
Martin Ender

2
การอภิปราย Meta ถูกแบ่งออกว่าปริศนาการเขียนโปรแกรมที่ไม่มีเกณฑ์การชนะเพิ่มเติมอยู่ในหัวข้อหรือไม่ ฉันควรเปิดคำถามเมื่อไม่แน่ใจดังนั้นฉันจึงลงคะแนนให้เปิดใหม่ หากคุณมีความคิดเห็นโปรดช่วยพวกเขาในการอภิปราย
xnor

2
@DenkerAffe ฉันไม่คิดว่าการรวมกันของพารามิเตอร์ที่ชัดเจนใด ๆ ในสี่ทำงาน
Martin Ender

3
สมมติว่ามีคำตอบที่ถูกต้องนี่เป็นคำถามที่ยอดเยี่ยมไม่ว่าจะเหมาะสมกับสิ่งที่เราพิจารณาในหัวข้อปกติหรือไม่ ฉันคิดว่าหนึ่งในเหตุผลที่เราไม่พิจารณาคำถามเช่นนี้ในหัวข้อคือคำถามอื่น ๆ ที่ฉันเคยเห็นเช่นนี้เกิดขึ้นโดยผู้เริ่มต้นและคำตอบนั้นชัดเจนมาก
เลเวลริเวอร์เซนต์

5
@Widi ลองคิดดูว่าทำไม "การแก้ปัญหาที่ถูกต้องครั้งแรก" อาจไม่ใช่ความคิดที่ดีที่สุด คุณอาจได้รับวิธีแก้ปัญหาที่ไม่น่าสนใจ แต่ใช้งานได้ซึ่งสับสนกับการใช้งานภายในผ่านการสะท้อนกลับและจากนั้นก็ไม่มีแรงจูงใจให้ใครก็ตามที่กำลังมองหาทางออกที่น่าสนใจยิ่งขึ้นโดยไม่มีการสะท้อนกลับ
Martin Ender

คำตอบ:


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สำหรับฉันด้วยการนำ C # ที่มาพร้อมกับ Visual Studio 2015 มาใช้จริงฉันไม่รู้ C # ใด ๆ แต่ฉันคิดว่าฉันจะลองเขียนโค้ด C และดูว่ามันทำงานได้หรือไม่ ฉันหวังว่าคอมไพเลอร์จะคิดว่า True เป็นตัวแทนเสมอ 1 และใช้ bitwise AND ในโหมดดีบั๊กนี่เป็นกรณีแน่นอน (สามารถใช้งานได้กับรีลีสด้วย) มันใช้ค่าบิตและในเงื่อนไขแรกและสองเปรียบเทียบกับศูนย์สำหรับวินาที:

            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

ฉันลองสิ่งเดียวกัน แต่ดูเหมือนจะไม่ทำงานใน Mono ภายใต้ Linux
jimmy23013

สิ่งนี้จะขึ้นอยู่กับคอมไพเลอร์ C # (ปัจจุบันคือ Roslyn จาก MS) แต่ใช้กับคอมไพเลอร์ JIT (ปัจจุบันคือ RyuJIT จาก MS) ถึงแม้ว่า IL ผู้แปล C # จะสร้างผลกระทบต่อสิ่งที่ JIT ทำ
บ๊อบ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.