Tôi đang làm việc trên trình biên dịch C# và cố gắng hiểu các quy tắc của các phép toán.
Tôi thấy rằng giữa hai loại nguyên thủy khác nhau sử dụng ==
Hành vi không thể hiểu được xảy ra khi sử dụng toán tử.
int a = 1;
phao b = 1,0f;
Console.WriteLine(a == b);
Điều này thực sự biên dịch thành
.locals init (
[0] int32,
[1] phao32
)
IL_0000: không
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: ldc.r4 1
IL_0008: stloc.1
IL_0009: ldloc.0
IL_000a: conv.r4
IL_000b: ldloc.1
IL_000c: ceq
这意味着
(phao)a == (phao)b
Kỳ vọng của tôi là(int)a == (int)b
, vì giá trị là một整数
.
Có lý do nào cho kết quả này không?
- Đây là dự đoán của tôi:
int-> float
So sánh float->int
nhanh
Điều này thực sự có liên quan đếntốc độKhông có gì liên quan đến (như bạn đề xuất), liên quan nhiều hơn đếnchuyển đổi ngầmVì thế, bạn có thể tìm thấy thông tin liên quan trong chủ đề <định>định>Thông số kỹ thuật C# trong các chương trình khuyến mãi kỹ thuật số
12.4.7 Khuyến mãi bằng số
Khuyến mãi số bao gồm tự động thực hiện nhất định chuyển đổi tiềm ẩn của toán hạng của được xác định trước đơn nhất and nhị phân số toán tử. Khuyến mãi số không phải là một cơ chế riêng biệt mà là một tác động của việc áp dụng độ phân giải quá tải đến được xác định trước toán tử. Khuyến mãi số đặc biệt không ảnh hưởng đến việc đánh giá do người dùng xác định toán tử, mặc dù do người dùng xác định toán tử có thể được thực hiện để thể hiện những tác động tương tự.
Như một ví dụ về khuyến mãi số, hãy xem xét việc triển khai nhị phân được xác định trước * toán tử:
toán tử int *(int x, int y);
toán tử uint *(uint x, uint y);
toán tử dài *(dài x, y dài);
toán tử ulong *(ulong x, ulong y);
toán tử float *(float x, float y);
toán tử kép *(double x, double y);
toán tử thập phân *(thập phân x, thập phân y);
Khi độ phân giải quá tải quy tắc (§12.6.4) được áp dụng cho bộ này toán tử, tác dụng là chọn cái đầu tiên trong số toán tử vì cái gì chuyển đổi tiềm ẩn tồn tại từ toán hạng các loại.
Đi xa hơn
nhị phân khuyến mãi số xảy ra đối với các toán hạng được xác định trước +
, –
, *
, /
, %
, &
, |
, ^
, ==
, !=
, >
, <
, >=
, Và <=
Toán tử nhị phân Xúc tiến số nhị phân ngầm chuyển đổi cả hai toán hạng thành một loại chung, trong trường hợp các toán tử không quan hệ, cũng trở thành loại kết quả của phép toán. Xúc tiến số nhị phân bao gồm việc áp dụng các quy tắc sau, theo thứ tự chúng xuất hiện ở đây. :
- Nếu một trong hai toán hạng thuộc loại thập phân thì toán hạng còn lại sẽ được chuyển đổi thành loại thập phân hoặc xảy ra lỗi thời gian liên kết nếu toán hạng kia thuộc loại float hoặc double.
- Ngược lại, nếu một trong hai toán hạng thuộc loại double thì toán hạng còn lại sẽ được chuyển thành loại double.
- Ngược lại, nếu một trong hai toán hạng thuộc kiểu float thì toán hạng còn lại sẽ được chuyển thành kiểu float.
- Ngược lại, nếu một trong hai toán hạng thuộc loại ulong thì toán hạng còn lại sẽ được chuyển đổi thành loại ulong hoặc xảy ra lỗi thời gian liên kết nếu toán hạng kia thuộc loại sbyte, short, int hoặc long.
- Ngược lại, nếu một trong hai toán hạng thuộc loại dài thì toán hạng còn lại sẽ được chuyển thành loại dài.
- Ngược lại, nếu một trong hai toán hạng thuộc loại uint và toán hạng kia thuộc loại sbyte, short hoặc int, thì cả hai toán hạng đều được chuyển đổi thành loại dài.
- Ngược lại, nếu một trong hai toán hạng thuộc loại uint thì toán hạng còn lại sẽ được chuyển thành loại uint.
- Ngược lại, cả hai toán hạng đều được chuyển đổi thành kiểu int.
Bạn có thể cảm nhận được điều này thông qua các ví dụ họ đưa ra
byte b = 1;
ngắn a = 2;
WriteLine((int)b==(int)s); // thăng cấp cả hai thành int
int tôi = 1;
gấp đôi d = 2;
WriteLine((double)i==d); // thúc đẩy i tăng gấp đôi
Hoặc ví dụ của bạn
int a = 1;
phao b = 1,0f;
WriteLine((float)a==b); // thúc đẩy a thành float
Tôi là một lập trình viên xuất sắc, rất giỏi!