2015-06-29 15 views
122

tôi đã tìm thấy chương trình C này từ trang web:Làm thế nào để chương trình dưới đây xuất ra 'C89` khi được biên dịch ở chế độ C89 và `C99` khi được biên dịch ở chế độ C99?

#include <stdio.h> 

int main(){ 

    printf("C%d\n",(int)(90-(-4.5//**/ 
    -4.5))); 

    return 0; 
} 

Điều thú vị với chương trình này là khi nó được biên dịch và chạy trong chế độ C89, nó in C89 và khi nó được biên dịch và chạy trong C99 chế độ, nó in C99. Nhưng tôi không thể tìm ra cách chương trình này hoạt động.

Bạn có thể giải thích cách đối số thứ hai của printf hoạt động trong chương trình trên không?

+44

Gợi ý: C++ - style '//' bình luận đã được giới thiệu trong C99. –

+3

Mẹo hay - nhưng không thành công với 'gcc'. Nếu không có 'std = c99' bạn sẽ nhận được một cảnh báo, và nếu bạn bỏ qua nó,' gcc' sẽ * vẫn * giải thích '//' là khởi đầu của chú thích (ah - bạn cũng phải sử dụng '-pantic' Tôi có điều đó theo mặc định.) – usr2564301

+3

@Jongware Vâng, tôi đã nhận 'C89' với' std = c89' rõ ràng trong gcc 4.9.2. – ikh

Trả lời

132

C99 cho phép // nhận xét kiểu, C89 thì không. Vì vậy, để dịch:

C99:

printf("C%d\n",(int)(90-(-4.5  /*Some comment stuff*/ 
         -4.5))); 
// Outputs: 99 

C89:

printf("C%d\n",(int)(90-(-4.5/  
         -4.5))); 
/* so we get 90-1 or 89 */ 
25

dòng comment // được giới thiệu từ C99. Do đó mã của bạn là bằng này trong C89

#include <stdio.h> 

int main(){ 

    printf("C%d\n",(int)(90-(-4.5/ 
-4.5))); 

    return 0; 
} 
/* 90 - (-4.5/-4.5) = 89 */ 

và bằng này trong C99

#include <stdio.h> 

int main(){ 

    printf("C%d\n",(int)(90-(-4.5 
-4.5))); 

    return 0; 
} 
/* 90 - (-4.5 - 4.5) = 99*/ 
9

// ý kiến ​​chỉ tồn tại trong C99 và các tiêu chuẩn sau, mã tương đương như sau:

#include <stdio.h> 

int main (void) 
{ 
    int vers; 

    #if __STDC_VERSION__ >= 201112L 
    vers = 99; // oops 
    #elif __STDC_VERSION__ >= 199901L 
    vers = 99; 
    #else 
    vers = 90; 
    #endif 

    printf("C%d", vers); 

    return 0; 
} 

mã đúng sẽ là:

#include <stdio.h> 

int main (void) 
{ 
    int vers; 

    #if __STDC_VERSION__ >= 201112L 
    vers = 11; 
    #elif __STDC_VERSION__ >= 199901L 
    vers = 99; 
    #else 
    vers = 90; 
    #endif 

    printf("C%d", vers); 

    return 0; 
} 
+0

lỗi off-by-one trong câu trả lời của bạn, làm thế nào để bạn nhận được 90 khi nó được cho là để in 89? – Pimgd

+1

@Pimgd C89 và C90 cũng giống nhau. http://stackoverflow.com/questions/17206568/what-is-the-difference-between-c-c99-ansi-c-and-gnu-ca-general-confusion-reg/17209532#17209532 – Lundin

+3

Chúng có nghĩa là giống nhau nhưng nó không phải là cùng một chuỗi. Đứng trước câu hỏi ban đầu của tôi. – Pimgd

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