cuốn sách gpt4 ai đã làm

c# - 为什么 (int)==(float) 总是编译为 (float)==(float)

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 18:01:55 26 4
mua khóa gpt4 Nike

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

câu trả lời hay nhất

Đ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>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

Về C# - tại sao (int)==(float) luôn biên dịch thành (float)==(float), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/55624052/

26 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress