Vì vậy, tôi đã xem xét ILDASM, kiểm tra một .exe mà trông như thế này:Toán tử == chính xác làm gì?
int a = 2;
Int32 b = 1;
if(b == 1)
{
}
Bây giờ, mã CIL trông như thế:
IL_0005: ldloc.1
IL_0006: ldc.i4.1
IL_0007: ceq
IL_0009: ldc.i4.0
IL_000a: ceq
IL_000c: stloc.2
Tôi hiểu rằng đầu tiên b được nạp (được lưu trữ tại [1]), sau đó một hằng số với giá trị là 1 và sau đó chúng được so sánh. Những gì tôi không hiểu là tại sao một hằng số khác với giá trị 0 được nạp và so sánh, trước khi kết quả của so sánh đó được lưu trữ.
Vì so sánh đầu tiên đã tạo ra giá trị chân lý, hãy kiểm tra nếu giá trị này là 0 đảo ngược kết quả, phải không?
Câu hỏi của tôi bây giờ là: tại sao nó bị đảo ngược? Tôi cho rằng nó có liên quan đến toán tử == mà tôi đã sử dụng và lý thuyết của tôi là nó trả về sự khác biệt. Nếu sự khác biệt này là 0, các giá trị là như nhau, do đó, đúng sẽ là kết quả. Nhưng 0 là viết tắt của sai, vì vậy nó cần phải được đảo ngược.
Tôi dường như không thể tìm thấy bất cứ điều gì về chủ đề này, chỉ cần một cái gì đó về các nhà khai thác như == ~ hoặc thích. Hy vọng bạn có thể soi sáng cho tôi :)
Trân trọng
Wilsu
PS: Đây là mã đầy đủ:
.method private hidebysig instance void Form1_Load(object sender,
class [mscorlib]
System.EventArgs e) cil managed
{
// Code size 19 (0x13)
.maxstack 2
.locals init ([0] int32 a,
[1] int32 b,
[2] bool CS$4$0000)
IL_0000: nop
IL_0001: ldc.i4.2
IL_0002: stloc.0
IL_0003: ldc.i4.1
IL_0004: stloc.1
IL_0005: ldloc.1
IL_0006: ldc.i4.1
IL_0007: ceq
IL_0009: ldc.i4.0
IL_000a: ceq
IL_000c: stloc.2
IL_000d: ldloc.2
IL_000e: brtrue.s IL_0012
IL_0010: nop
IL_0011: nop
IL_0012: ret
} // end of method Form1::Form1_Load
Tôi không hiểu điều đó chút nào. Tôi đoán là nó từ một đoạn mã khác. Vui lòng đăng một ví dụ ngắn nhưng * hoàn thành *. –
Tôi nhận được cùng một (ít nhất là kết quả tương tự) chỉ với mã này bên trong chính. – Rob
bạn có đang biên soạn bản phát hành không? (Tôi không thấy bất kỳ "nop", nhưng ...), và: đây có phải là toàn bộ mã * không? Có vẻ như nó đã thực hiện một số thứ tự vui vẻ, p Nhưng: Tôi không thấy biến số thứ 3, vì vậy nó không rõ ràng đối với tôi những gì 'stloc.2' thậm chí * có nghĩa là * ... –