2011-06-18 62 views
37

Vì nó không được gõ mạnh, tôi nghĩ nó vừa chọn kích thước bộ nhớ phù hợp và diễn giải nó dựa trên kiểu đối số. Nhưng float và double đều sử dụng% f và chúng có kích thước khác nhau.Làm thế nào để printf và đồng phân biệt giữa float và double

P.S. Tôi có thể xem cách quảng bá thông qua việc sao chép giá trị vào tạm thời và truyền (có phải không?) Có thể hoạt động nhưng cách hoạt động cho scanfs/sscanf?

+0

[Tại sao printf() quảng bá phao lên gấp đôi?] (Http://stackoverflow.com/q/28097564/995714) –

Trả lời

55

Nó không phân biệt. Không thể nhận được một số float dưới dạng vararg: bất kỳ đối số float nào bạn cung cấp trước tiên được thăng cấp thành double.

6.5.2.2/6 xác định "quảng cáo đối số mặc định" và/7 cho biết quảng cáo đối số mặc định được áp dụng cho "đối số theo sau", đó là varargs được biểu thị bằng ....

nó hoạt động như thế nào cho scanfs/sscanf?

Định dạng %f cho scanf yêu cầu con trỏ đến float. %lf yêu cầu con trỏ đến double, %Lf yêu cầu con trỏ đến long double.

sao chép các giá trị cho một temp và đúc (là quyền này?)

Nếu bạn cung cấp một đối số float, sau đó thực hiện tạo ra một tạm thời kiểu double, khởi tạo nó với giá trị float, và chuyển nó thành vararg. Đúc theo định nghĩa là rõ ràng chuyển đổi bằng cách sử dụng toán tử truyền - bạn có thể truyền nếu bạn muốn để làm cho nó chính xác rõ ràng cho người đọc những gì đang xảy ra, nhưng float f = 3; printf("%f", f); là chính xác giống như float f = 3; printf("%f", (double)f);. Quảng cáo đối số mặc định có cùng ý nghĩa với dàn diễn viên.

+0

Còn scanf thì sao? –

+0

Cảm ơn, printfs (tiêu chuẩn hoặc mở rộng) chấp nhận rằng đối với đôi cũng như để giữ đối xứng? –

+7

Ồ, nếu bạn muốn nói "tôi có thể sử dụng% lf và% Lf làm định dạng trong' printf' và co "thì có, bạn có thể. % lf chính xác giống như% f, cả hai đều lấy một 'double'. % Lf có một 'long double'. –

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