Tôi đang đọc qua một số mã giả lập và tôi đã phản bác lại điều gì đó thực sự kỳ quặc:
switch (reg){
case 'eax':
/* and so on*/
}
Sao có thể như thế được? Tôi nghĩ rằng bạn chỉ có thể switch
trên các loại tích phân. Có một số thủ thuật vĩ mô đang diễn ra không?
int
, vì vậy nó hợp pháp. Tuy nhiên, giá trị của một hằng số nhiều ký tự được xác định bởi việc triển khai, vì vậy mã có thể không hoạt động như mong đợi trên một trình biên dịch khác. Ví dụ, eax
có thể là 0x65
, 0x656178
, 0x65617800
, 0x786165
, 0x6165
, hay cái gì khác.
'eax' != 'ebx'
Tất nhiên, chỉ miễn là , vì vậy nó chỉ thất bại một hoặc hai ví dụ của bạn. Mặc dù có thể có một số mã ở đâu đó giả định trên thực tế *(int*)("eax") == 'eax'
, và do đó hầu hết các ví dụ của bạn không thành công.
'eax'
có thể so sánh bằng 'ebx'
hoặc với 'ax'
, và câu lệnh switch sẽ không hoạt động như dự định.
'eax'
và nó liệt kê giá trị số nguyên liên tục