2013-03-25 27 views
9

Tôi là sinh viên lập trình mới bắt đầu, chỉ muốn tìm hiểu lý do đằng sau điều này.C90 không cho phép% lf sử dụng trong printf, tại sao?

Khi tôi sử dụng mã này:

#include <stdio.h> 
int main() 
{ 
double pi = 3.1415926535897932; 
printf("%lf",pi); 
return 0; 
} 

trình biên dịch cung cấp cho cảnh báo này. ISO C90 không hỗ trợ 'lf%' định dạng gnu_printf [-Wformat]

tôi sử dụng trình biên dịch gcc trong terminal ubuntu với (-o Wall -ansi -pedantic-lỗi)

lý do đằng sau là gì điều này? Tôi đã tìm kiếm trên web và thấy rằng việc sử dụng này được cho phép trong C99. Tại sao C90 không cho phép% lf sử dụng trong printf? Tôi có thể sử dụng% .16lf hoặc% .16f và cả hai bản in với cùng độ chính xác, vậy vấn đề gì khiến% lf kém trong C90?

+6

Vì nó không được chuẩn hóa cho đến sau này? –

+3

'% lf' không sử dụng cho gia đình' printf', chỉ dành cho họ 'scanf'. –

+0

Có thể trùng lặp: http://stackoverflow.com/questions/6395726/how-does-printf-and-co-differentiate-beetween-float-and-double –

Trả lời

8

Theo C90 tài liệu:

một l tùy chọn (ell) xác định rằng một d sau, i, o, u, x, hoặc X xác định chuyển đổi áp dụng cho một chặng đường dài int hoặc unsigned long int tranh luận; một tùy chọn l chỉ định rằng một biến đổi n sau đây chỉ định áp dụng cho một con trỏ đến đối số int dài; hoặc một tùy chọn L chỉ định rằng một e, E, f, g hoặc G chuyển đổi sau đây chỉ định áp dụng cho một đối số dài dài gấp đôi. Nếu h, l hoặc L xuất hiện với bất kỳ công cụ chỉ định chuyển đổi nào khác, hành vi là không xác định.

3

C là ngôn ngữ phát triển. Các tính năng và hành vi mới được thêm vào trong mỗi bản phát hành mới của tiêu chuẩn C.

C89 nói rằng l trước f dẫn đến hành vi không xác định. Và C90 có thể nói như vậy.

Mặt khác, C99 nói rằng l trước f không có hiệu lực.

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