2012-03-29 34 views
7

Sự khác biệt dưới đây có đáng kể trong C# không?Ưu tiên hoạt động của Cast trong C#

int a, b; 
double result; 
result = (double)a/b; 
result = a/(double)b; 
result = (double)a/(double)b; 

Bạn sử dụng công cụ nào?

+0

Chỉ cần đảm bảo rằng bạn KHÔNG sử dụng 'result = (double) (a/b); ' –

+0

Không cần điều gì trong số này. 'a' và' b' đã tăng gấp đôi. biến kết quả là một đôi. Điều duy nhất mà sẽ không phải là một đôi là kết quả phân chia của hai đôi. Nếu tôi không nhầm thì có tự nhiên đúc từ một số nguyên để doule trong một trường hợp như thế này. –

+1

@Ramhound 'a' và' b' là số nguyên, không tăng gấp đôi. Việc thực hiện 'result = a/b' sẽ dẫn đến một phân chia số nguyên, sau đó một phép tính thành hai lần. – Msonic

Trả lời

10

Dàn diễn viên sẽ diễn ra trước khi chia.

Trong ví dụ của bạn, không quan trọng bạn làm như thế nào nếu một toán hạng là gấp đôi, thời gian chạy sẽ chuyển đổi/chuyển đổi giá trị kia thành gấp đôi.

Điều này trông giống như tối ưu hóa vi mô - không phải điều đáng lo ngại hoặc giải quyết trừ khi các phép đo cho thấy đó thực sự là một nút cổ chai.

+0

Mối quan tâm chính của tôi là độ chính xác ở cuối tính toán. Tôi sợ rằng bất cứ ai tôi chọn để đúc (đầu tiên, rõ ràng) tạo sự khác biệt. Nhưng kể từ khi bạn nói rằng các internals sẽ cast tất cả mọi người trong số họ, tôi sẽ tin tưởng bạn. – Jake

+0

@Jake - tin tưởng, nhưng xác minh ... Đây là một cái gì đó bạn có thể _easily_ thử nghiệm trên của riêng bạn (chỉ cần viết một ứng dụng nhỏ mà các loại tính toán khác nhau). – Oded

+1

Trên thực tế, ứng dụng nhỏ sẽ không chứng minh bất cứ điều gì. Một tập con nhỏ của toán hạng thử nghiệm không thể đại diện cho kết quả cho tất cả toán hạng có thể, trừ khi nó được xác định đầu tiên rằng nó được thực hiện như vậy. Do đó tôi phải hỏi câu hỏi này. – Jake

2

Tôi làm điều này:

result = (double)a/(double)b; 

Nó có thể là nghiêm chỉnh không cần thiết, nhưng nói chung tôi muốn làm chắc chắn rằng nó sẽ không làm phân chia số nguyên, và tôi không thực sự quan tâm để nhớ các quy tắc cụ thể đối với kịch bản này, vì vậy sẽ dễ dàng hơn (nếu có thêm vài lần nhấn phím) rõ ràng.

+0

Thực ra tôi đang làm điều này * bởi vì * Tôi không bận tâm nhớ những chi tiết cụ thể. Nhưng tôi quyết định thay đổi thói quen lười biếng của mình, vì thế tôi đã hỏi câu hỏi này. (btw, tôi đã không cung cấp cho bạn -1) – Jake

+0

@Jake tốt cho bạn, cố gắng kiềm chế thói quen lười biếng! :) –

0

Tôi làm (double)a/b vì tôi tưởng tượng một cái gì đó không thể tách rời như đá hay gì đó. Khi đúc thành một đôi nó trở thành chia hết, như một chiếc bánh. Bạn có thể chia 3,0 bánh trong bốn phần, nhưng bạn không thể chia ba hòn đá trong 4.0 phần. Hoặc một cái gì đó. Làm cho bất kỳ ý nghĩa?

Các vấn đề liên quan