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.
Nguồn
2011-06-18 11:43:29
[Tại sao printf() quảng bá phao lên gấp đôi?] (Http://stackoverflow.com/q/28097564/995714) –