Трохи булі магії


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. Для майбутніх проблем дозвольте мені порекомендувати пісочницю, де ви можете отримати зворотній зв'язок перед тим, як виклик буде реалізований.
Мартін Ендер

2
Мета-дискусія розбита на те, чи є головоломки програмування без додаткових критеріїв виграшу на тему , при цьому використовуються конфліктні відповіді. Я вважаю за краще тримати питання відкритими, коли це не вирішено, тому я голосую за повторне відкриття. Якщо у вас є думки, будь ласка, внесіть їх до обговорення.
xnor

2
@DenkerAffe Я не думаю, що жодна з чотирьох очевидних комбінацій параметрів не працює.
Мартін Ендер

3
якщо припустити, що це відповідь, це відмінне запитання, незалежно від того, чи відповідає це те, що ми зазвичай вважаємо темою. + 1. Я думаю, що одна з причин, як правило, ми не розглядаємо подібні питання на цю тему, це те, що кожне інше, що я бачив подібне, був початківцем, і відповідь сліпо очевидна.
Рівень р. Св.

5
@Widi Дивіться, тому "перше дійсне рішення" може бути не найкращою ідеєю. Можливо, ви отримаєте нецікаве, але робоче рішення, яке просто заплутається з деякими внутрішніми елементами через рефлексію, і тоді ніхто не стимулює шукати цікавіше рішення без роздумів.
Мартін Ендер

Відповіді:


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, і використовувати порозрядне значення AND. У режимі налагодження це дійсно так (він працював і з 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

Я спробував те саме, але, схоже, це не працює в Mono під Linux.
jimmy23013

Це залежатиме не від компілятора C # (зараз Рослін від MS), а від компілятора JIT (зараз RyuJIT від MS). Хоча IL-компілятор C # виробляє, також може вплинути на те, що робить JIT.
Боб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.