Một chút ma thuật


20

Thử thách

Cho phương pháp C # sau:

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

Cung cấp các giá trị abdo đó trueđược trả lại.

Điều kiện chiến thắng

Mục đầu tiên, người có thể cung cấp các đối số chính xác để làm cho phương thức đã cho đánh giá thành truethắng.


4
Chào mừng đến với PPCG! Tất cả các thử thách ở đây cần một tiêu chí chiến thắng khách quan để có thể chọn một người chiến thắng nếu có nhiều bài nộp. Có vẻ như chỉ có một giải pháp duy nhất ở đây, vì vậy thách thức này có thể không phù hợp với PPCG. Đối với các thử thách trong tương lai, hãy để tôi giới thiệu hộp cát nơi bạn có thể nhận phản hồi trước khi thử thách được triển khai.
Martin Ender

2
Thảo luận meta được phân chia về việc các câu đố lập trình mà không có tiêu chí chiến thắng bổ sung có thuộc chủ đề hay không , với các câu trả lời mâu thuẫn được đưa ra. Tôi muốn giữ câu hỏi mở khi nó không được giải quyết, vì vậy tôi sẽ bỏ phiếu để mở lại. Nếu bạn có ý kiến, xin vui lòng đóng góp cho các cuộc thảo luận.
xnor

2
@DenkerAffe Tôi không nghĩ bất kỳ kết hợp tham số rõ ràng nào trong bốn kết hợp tham số rõ ràng đều hoạt động.
Martin Ender

3
giả sử có một câu trả lời hợp lệ, đây là một câu hỏi xuất sắc, bất kể nó có phù hợp với những gì chúng ta thường xem xét về chủ đề hay không. + 1. Tôi nghĩ một trong những lý do chúng ta thường không xem xét các câu hỏi như thế này về chủ đề này là mọi câu hỏi khác mà tôi đã thấy như thế này là của người mới bắt đầu và câu trả lời đã rõ ràng rõ ràng.
Cấp sông St

5
@Widi Xem đó là lý do tại sao "giải pháp hợp lệ đầu tiên" có thể không phải là ý tưởng tốt nhất. Bạn có thể nhận được một giải pháp không thú vị nhưng hiệu quả, chỉ gây rối với một số nội bộ thông qua phản xạ và sau đó không có động lực cho bất cứ ai tìm kiếm một giải pháp thú vị hơn mà không cần phản ánh.
Martin Ender

Câu trả lời:


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

Bản in này Truecho tôi với triển khai C # đi kèm với Visual Studio 2015. Tôi thực sự không biết bất kỳ C # nào, nhưng tôi đoán rằng tôi sẽ thử viết một số mã C và xem nó có hoạt động không. Tôi đã hy vọng rằng trình biên dịch sẽ cho rằng True luôn được biểu diễn là 1 và sử dụng bit AND. Trong chế độ Gỡ lỗi, đây thực sự là trường hợp (nó cũng hoạt động với Phiên bản). Nó sử dụng bitwise AND cho điều kiện thứ nhất và hai phép so sánh bằng 0 cho lần thứ hai:

            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  

Kinh ngạc! Tôi hoàn toàn chắc chắn rằng điều đó không thể thực hiện được
edc65

Tôi đã thử điều tương tự nhưng dường như nó không hoạt động trong Mono trong Linux.
jimmy23013

Điều này sẽ không phụ thuộc vào trình biên dịch C # (hiện tại là Roslyn từ MS) mà phụ thuộc vào trình biên dịch JIT (hiện tại là RyuJIT từ MS). Mặc dù IL, trình biên dịch C # tạo ra cũng có thể ảnh hưởng đến những gì JIT làm.
Bob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.