2013-03-22 21 views
15

Tôi thấy điều này tất cả các thời gian:Điểm sử dụng 'f' khi gán giá trị cho CGFloat là gì?

CGFloat someCGFloat = 1.2f; 

Tại sao 'f' được sử dụng? Nếu số CGFloat được định nghĩa là float, giá trị sẽ được chuyển đổi thành float và nếu số CGFloat được định nghĩa là double, giá trị sẽ được chuyển đổi thành double.

Chỉ để đảm bảo chuyển đổi từ double thành float không xảy ra? Điểm của việc đó là gì? Ngoài ra, trình biên dịch sẽ không quan tâm đến điều này?

CHỈNH SỬA: Hmmm ... câu trả lời để chấp nhận ... cả hai đều rất tốt!

+1

Tôi không biết điểm nào trong bài tập được giao. Tôi nghĩ rằng f có thể hữu ích nếu bạn không sử dụng hằng số trong một thuật ngữ không đổi (tức là 'someFloat = 3.0 * someOtherFloat' thực sự có thể dẫn đến chuyển đổi không cần thiết tùy thuộc vào trình biên dịch.) Không trực tiếp trả lời câu hỏi của bạn. –

+0

@MaxE. Tôi hiểu rồi. Đó là hữu ích, cảm ơn! – fumoboy007

+0

Khả năng đọc không được giảm giá. – GoZoner

Trả lời

8

1.0 theo mặc định là gấp đôi, nếu giá trị đúng là 1,2 có một diễn viên ngầm, và giá trị được đúc từ đôi sang phao (diễn viên không phải là một hoạt động thời gian chạy). Trong trường hợp này, điều quan trọng không gọi là 1.2f. Các lập trình viên chủ yếu lạm dụng nó, nhưng có những trường hợp nó thực sự quan trọng.

Ví dụ:

float var= 1.0e-45; 
NSLog(@"%d",var==1.0e-45); 

này in bằng không, vì 1.0e-45 là quá nhỏ để có thể được lưu trữ vào một độ chính xác đơn biến dấu chấm động, vì vậy nó trở nên bằng zero. Viết var == 1.0e-45f thay đổi kết quả.

Sử dụng trình định dạng định dạng quan trọng chủ yếu khi viết biểu thức và vì giá trị bên trái là dấu phẩy mà bạn cho rằng biểu thức được coi là phao, nhưng đó không phải là điều xảy ra.

Một trường hợp đáng chú ý hơn là khi sử dụng specifier định dạng l trên con số đó được chuyển rất nhiều để trở thành số không, và bị bất ngờ về kết quả:

long var= 1<<32; // I assume that an int takes 4 bytes and a long 8 bytes 

Kết quả là số không, và viết 1 lít < < 32 hoàn toàn thay đổi kết quả.

7

Trong đoạn mã của bạn, chỉ là bài tập, bạn không cần hậu tố 'f' và thực tế bạn không nên sử dụng nó. Nếu CGFloat là độ chính xác đơn (như trong iOS) thì giá trị của bạn sẽ được lưu trữ với độ chính xác đơn có hoặc không có 'f' và nếu CGFloat là chính xác gấp đôi (như trên Mac OS) thì bạn sẽ không cần thiết tạo ra một giá trị chính xác duy nhất lưu trữ chính xác gấp đôi.

Mặt khác, nếu bạn đang làm số học, bạn nên cẩn thận sử dụng 'f' hoặc không sử dụng nó khi thích hợp. Nếu bạn đang làm việc với độ chính xác đơn và bao gồm một chữ như '1.2' mà không có 'f' thì trình biên dịch sẽ thúc đẩy các toán hạng khác tăng gấp đôi độ chính xác. Và nếu bạn đang làm việc với độ chính xác gấp đôi và bạn bao gồm 'f' thì (giống như việc gán trên Mac OS), bạn sẽ tạo một giá trị chính xác duy nhất để có nó ngay lập tức được chuyển đổi thành gấp đôi.

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