जब C99 मोड में संकलित किया जाता है और C99 मोड में संकलित किया जाता है, तो नीचे दिए गए प्रोग्राम आउटपुट `C89` कैसे करता है?


128

मुझे वेब से यह C प्रोग्राम मिला है:

#include <stdio.h>

int main(){

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

    return 0;
}

इस कार्यक्रम के साथ दिलचस्प बात यह है कि जब इसे C89 मोड में संकलित और चलाया जाता है, तो यह प्रिंट करता है C89और जब इसे संकलित किया जाता है और C99 मोड में चलाया जाता है, तो यह प्रिंट करता है C99। लेकिन मैं यह पता लगाने में सक्षम नहीं हूं कि यह कार्यक्रम कैसे काम करता है।

क्या आप बता सकते हैं printfकि उपरोक्त कार्यक्रम में काम का दूसरा तर्क कैसे है ?


47
संकेत: C ++ शैली //टिप्पणी C99 में पेश की गई थी।
पॉल आर।

4
अच्छी चाल - लेकिन यह विफल रहता है gcc। बिना std=c99आपको एक चेतावनी मिलेगी, और यदि आप इसे अनदेखा करते हैं, तब भी एक टिप्पणी की शुरुआत के रूप में व्याख्या gccकरेगा (आह - आपको भी उपयोग करना होगा । मेरे पास डिफ़ॉल्ट रूप से है।)//-pedantic
usr2564301

3
@Jongware खैर, मैं C89स्पष्ट रूप std=c89से gcc में 4.9.2 के साथ मिला ।
--ख

60
बस अगर किसी को C99 समर्थन के लिए परीक्षण करने के तरीके की खोज करते समय यह मिलता है; कृपया कुछ का उपयोग करें #if __STDC_VERSION__ >= 199901L, //टिप्पणी की चाल नहीं। =)
अर्कु

10
यह C11 के लिए "C99" भी प्रिंट करता है ...
लंडिन

जवाबों:


133

C99 //-style टिप्पणियों की अनुमति देता है , C89 नहीं करता है। तो, अनुवाद करने के लिए:

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

लाइन टिप्पणी //C99 के बाद से पेश की गई है। इसलिए C89 में आपका कोड इसके बराबर है

#include <stdio.h>

int main(){

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

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

और 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

क्योंकि //टिप्पणियां केवल C99 और बाद के मानकों में मौजूद हैं, कोड निम्नलिखित के बराबर है:

#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;
}

सही कोड होगा:

#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;
}

अपने उत्तर में एक-एक त्रुटि, 89 प्रिंट करने के लिए आपको 90 कैसे मिलते हैं?
पिमगड

1
@Pimgd C89 और C90 एक ही बात है। stackoverflow.com/questions/17206568/…
लंडिन

3
वे एक ही बात का मतलब है, लेकिन यह एक ही स्ट्रिंग नहीं है। अपने मूल प्रश्न के साथ खड़ा हूं।
पिमगड

@Pimgd उपरोक्त कोड का उद्देश्य किसी दिए गए प्रारूप के बाद तार को प्रिंट करने के लिए कुछ कृत्रिम कार्य करना नहीं है। इसका उद्देश्य यह दिखाना है कि IOCCC के बाहर वास्तविक-शब्द अनुप्रयोग किस C प्रोग्राम को संकलित करता है। C90 "C89" या "ANSI-C" की तुलना में अधिक सही है।
लुंडिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.