Sihir bool kecil

20

Tantangan

Diberikan metode C # berikut:

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

Berikan nilai adan byang truedikembalikan.

Kondisi menang

Entri pertama yang dapat memberikan argumen yang benar untuk membuat metode yang diberikan dievaluasi untuk truemenang.

aktor
sumber
4
Selamat datang di PPCG! Semua tantangan di sini membutuhkan kriteria kemenangan yang obyektif sehingga pemenang dapat dipilih jika ada banyak pengajuan. Sepertinya hanya ada satu solusi di sini, jadi tantangan ini mungkin tidak cocok untuk PPCG. Untuk tantangan di masa depan izinkan saya merekomendasikan kotak pasir tempat Anda bisa mendapatkan umpan balik sebelum tantangan itu ditayangkan.
Martin Ender
2
Diskusi meta terpecah pada apakah teka-teki pemrograman tanpa kriteria menang tambahan ada di topik , dengan jawaban yang bertentangan diangkat. Saya lebih suka membiarkan pertanyaan terbuka ketika tidak beres, jadi saya memberikan suara untuk dibuka kembali. Jika Anda memiliki pendapat, silakan berkontribusi di diskusi.
xnor
2
@DenkerAffe Saya tidak berpikir salah satu dari empat kombinasi parameter yang jelas bekerja.
Martin Ender
3
dengan asumsi ada jawaban yang valid, ini adalah pertanyaan yang sangat bagus, terlepas dari apakah itu cocok dengan apa yang biasanya kita pertimbangkan pada topik. + 1. Saya pikir salah satu alasan kita biasanya tidak mempertimbangkan pertanyaan seperti ini pada topik adalah bahwa setiap pertanyaan lain yang saya lihat seperti ini telah diajukan oleh seorang pemula, dan jawabannya sudah sangat jelas.
Level River St
5
@Widi Lihat itu sebabnya "solusi pertama yang valid" mungkin bukan ide terbaik. Anda mungkin mendapatkan solusi yang tidak menarik tetapi bekerja yang hanya mengacaukan beberapa internal melalui refleksi dan kemudian tidak ada insentif bagi siapa pun untuk mencari solusi yang lebih menarik tanpa refleksi.
Martin Ender

Jawaban:

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));
}

Ini mencetak Truebagi saya dengan implementasi C # yang datang dengan Visual Studio 2015. Saya sebenarnya tidak tahu C #, tapi saya pikir saya akan mencoba untuk menulis beberapa kode C dan melihat apakah itu berhasil. Saya berharap bahwa kompiler akan menganggap bahwa True selalu direpresentasikan sebagai 1 dan menggunakan bitwise AND. Dalam mode Debug, ini memang masalahnya (ini bekerja dengan Release juga). Ini menggunakan bitwise AND untuk kondisi pertama dan dua perbandingan ke nol untuk yang kedua:

            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  
feersum
sumber
Luar biasa! Saya benar-benar yakin itu tidak dapat dilakukan
edc65
Saya sudah mencoba hal yang sama tetapi sepertinya tidak berfungsi di Mono di Linux.
jimmy23013
Ini akan tergantung bukan pada kompiler C # (saat ini Roslyn dari MS) tetapi pada kompiler JIT (saat ini RyuJIT dari MS). Meskipun IL yang dihasilkan oleh kompiler C juga dapat mempengaruhi apa yang JIT lakukan.
Bob