%Lf là gì trong C

11/24/2010 6:45:28 AM

Đặng Giang Thanh · Đặng Giang Thanh 06:45 24/11/2010

Định dạng định dạng chính xác cho doubleprintf là gì? Là nó %fhay là nó %lf? Tôi tin nó %f, nhưng tôi không chắc chắn.

Mẫu mã

#include int main[] { double d = 1.4; printf["%lf", d]; // Is this wrong? }

  • c
  • printf
  • double
  • format-specifiers

405 hữu ích 2 bình luận 855k xem chia sẻ

answer

Hồ Thục Nhi · Hồ Thục Nhi 06:51 24/11/2010

"%f"là định dạng đúng [hoặc ít nhất một] cho một đôi. Có là không có định dạng cho một float, bởi vì nếu bạn cố gắng để vượt qua một floattới printf, nó sẽ được thăng chức doubletrước khi printfnhận nó 1 . "%lf"cũng được chấp nhận theo tiêu chuẩn hiện tại - lđược chỉ định là không có hiệu lực nếu được theo sau bởi công fcụ xác định chuyển đổi [trong số những người khác].

Lưu ý rằng đây là một nơi mà các printfchuỗi định dạng khác nhau đáng kể so với các chuỗi định dạng scanf[và fscanf, v.v.]. Đối với đầu ra, bạn đang đi qua một giá trị , mà sẽ được đề bạt từ floatđến doublekhi thông qua như là một tham số variadic. Đối với đầu vào bạn đang truyền một con trỏ không được quảng bá, vì vậy bạn phải cho biết scanfbạn muốn đọc a floathay a double, vì vậy scanf, %fcó nghĩa là bạn muốn đọc một floatvà %lfcó nghĩa là bạn muốn đọc một double[và, cho những gì giá trị, cho a long double, bạn sử dụng %Lfcho một trong hai printfhoặc scanf].

1. C99, §6.5.2.2 / 6: "Nếu biểu thức biểu thị hàm được gọi có loại không bao gồm nguyên mẫu, các quảng cáo số nguyên được thực hiện trên mỗi đối số và các đối số có kiểu float được tăng lên gấp đôi. Chúng được gọi là các chương trình khuyến mãi đối số mặc định. " Trong C ++, từ ngữ hơi khác một chút [ví dụ: nó không sử dụng từ "nguyên mẫu"] nhưng hiệu quả là như nhau: tất cả các tham số biến đổi trải qua các chương trình khuyến mãi mặc định trước khi chúng được hàm nhận.

524 hữu ích 5 bình luận chia sẻ

answer

Hoàng Xuân Hiếu · Hoàng Xuân Hiếu 23:10 28/04/2012

Với tiêu chuẩn C99 [cụ thể là dự thảo N1256 ], các quy tắc phụ thuộc vào loại chức năng: fprintf [printf, sprintf, ...] hoặc scanf.

Dưới đây là các phần có liên quan được trích xuất:

Lời tựa

Phiên bản thứ hai này hủy bỏ và thay thế phiên bản đầu tiên, ISO / IEC 9899: 1990, được sửa đổi và sửa chữa bởi ISO / IEC 9899 / COR1: 1994, ISO / IEC 9899 / AMD1: 1995 và ISO / IEC 9899 / COR2: 1996. Những thay đổi lớn từ phiên bản trước bao gồm:

  • %lf chỉ định chuyển đổi được phép trong printf

7.19.6.1 fprintfHàm

7 Các sửa đổi độ dài và ý nghĩa của chúng là:

l [ell] Chỉ định rằng [...] không có hiệu lực đối với chỉ định chuyển đổi a, A, e, E, f, F, g hoặc G.

L Chỉ định rằng một chỉ định chuyển đổi a, A, e, E, f, F, g hoặc G sau áp dụng cho một đối số kép dài.

Các quy tắc tương tự được chỉ định để fprintfáp dụng cho printf, sprintfvà các chức năng tương tự.

7.19.6.2 fscanfHàm

11 Các sửa đổi độ dài và ý nghĩa của chúng là:

l [ell] Chỉ định rằng [...] rằng a sau a, A, e, E, f, F, g hoặc G chỉ định chuyển đổi áp dụng cho một đối số có con trỏ kiểu để nhân đôi;

L Chỉ định rằng một chỉ định chuyển đổi a, A, e, E, f, F, g hoặc G sau đây áp dụng cho một đối số có con trỏ kiểu để nhân đôi dài.

12 Các chỉ định chuyển đổi và ý nghĩa của chúng là: a, e, f, g Ghép một số dấu phẩy động được ký tùy ý, [...]

14 Các chỉ định chuyển đổi A, E, F, G và X cũng hợp lệ và hoạt động tương tự như a, e, f, g và x.

Câu chuyện dài, dành cho fprintfcác nhà đầu cơ sau đây và các loại tương ứng được chỉ định:

  • %f -> gấp đôi
  • %Lf -> dài gấp đôi.

và cho fscanfnó là:

  • %f -> phao
  • %lf -> gấp đôi
  • %Lf -> dài gấp đôi.

53 hữu ích 0 bình luận chia sẻ

answer

Hồ Hải Trà · Hồ Hải Trà 06:48 24/11/2010

Nó có thể %f, %ghoặc %etùy thuộc vào cách bạn muốn số được định dạng. Xem ở đây để biết thêm chi tiết. Công cụ lsửa đổi là bắt buộc scanfvới double, nhưng không phải trong printf.

18 hữu ích 2 bình luận chia sẻ

answer

Võ Gia Linh · Võ Gia Linh 19:52 07/05/2016

Các printfđịnh dạng chính xác doublelà %lf, chính xác như bạn đã sử dụng nó. Không có gì sai với mã của bạn.

Định dạng %lftrong printfkhông được hỗ trợ trong các phiên bản cũ [trước C99] của ngôn ngữ C, điều này tạo ra sự "không nhất quán" hời hợt giữa các chỉ định định dạng cho doubletrong printfvà scanf. Sự không nhất quán bề ngoài đó đã được sửa trong C99.

Vì vậy, trong C hiện đại, nó làm cho tinh thần hoàn hảo để thích sử dụng %fvới float, %lfvới doublevà %Lfvới long doublemột cách nhất quán trong cả hai printfvà scanf.

9 hữu ích 0 bình luận chia sẻ

answer

Bùi Tố Như · Bùi Tố Như 06:49 24/11/2010

%Lf[lưu ý vốn L] là định dạng định dạng cho đôi dài .

Đối với đồng bằng doubles, hoặc là %e, %E, %f, %ghoặc %Gsẽ làm.

7 hữu ích 3 bình luận chia sẻ

Xem nguồn: //stackoverflow.com//questions/4264127/correct-format-specifier-for-double-in-printf

Video liên quan

Chủ Đề