C89 মোডে সংকলন করার সময় নীচের প্রোগ্রাম আউটপুট `C89` এবং C99 মোডে সংকলন করার সময়` C99` কীভাবে হয়?


128

আমি ওয়েব থেকে এই সি প্রোগ্রামটি পেয়েছি:

#include <stdio.h>

int main(){

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

    return 0;
}

এই প্রোগ্রামটির সাথে মজার বিষয়টি হ'ল এটি যখন C89 মোডে সংকলিত হয় এবং চালিত হয় C89তখন এটি মুদ্রণ করে এবং যখন এটি সংকলিত হয় এবং C99 মোডে চালিত হয়, এটি মুদ্রণ করে C99। তবে এই প্রোগ্রামটি কীভাবে কাজ করে তা আমি বুঝতে সক্ষম নই।

printfউপরের প্রোগ্রামে দ্বিতীয় যুক্তি কীভাবে কাজ করে তা আপনি ব্যাখ্যা করতে পারেন ?


47
ইঙ্গিত: সি ++ - স্টাইলের //মন্তব্য C99 সালে চালু হয়েছিল।
পল আর

4
দুর্দান্ত কৌশল - তবে এটি ব্যর্থ হয় gcc। ছাড়া std=c99আপনি একটি সর্তকবার্তা পান করব এবং যদি আপনি এটি উপেক্ষা gccকরবে এখনও ব্যাখ্যা //একটি মন্তব্য শুরুর হিসাবে (অই - আপনি ব্যবহার করতে হবে -pedantic। পাশাপাশি আমি ডিফল্টরূপে উপর রয়েছে।)
usr2564301

3
@ জংওয়্যার ওয়েল, আমি জিসিসি ৪.৯.২ এ C89স্পষ্টভাবে পেয়েছি std=c89
আইখ

60
কেবলমাত্র C99 সমর্থনের জন্য পরীক্ষার উপায় অনুসন্ধান করার সময় যদি কেউ এটি খুঁজে পায়; দয়া #if __STDC_VERSION__ >= 199901Lকরে //মন্তব্য কৌশল নয়, এর মতো কিছু ব্যবহার করুন। =)
আরক্কু

10
এটি সি 11 এর জন্য "সি 99" মুদ্রণ করে ...
লন্ডিন

উত্তর:


133

সি 99 //স্টাইল মন্তব্যের অনুমতি দেয় , সি 98 দেয় না। সুতরাং, অনুবাদ করতে:

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 সাল থেকে চালু হয়েছে। সুতরাং আপনার কোডটি সি 98 এ সমান

#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

যেহেতু //মন্তব্যগুলি কেবল সি 99 এবং পরবর্তী মানগুলিতে রয়েছে, কোডটি নিম্নলিখিতগুলির সাথে সমান:

#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
@ পিমজিডি সি 89 এবং সি 90 একই জিনিস। stackoverflow.com/questions/17206568/…
লন্ডিন

3
তারা একই জিনিস বোঝায় তবে এটি একই স্ট্রিং নয়। আমার মূল প্রশ্নে দাঁড়িয়ে।
পিএমজিডি

@ পিমজিডি উপরের কোডের উদ্দেশ্যটি কোনও নির্দিষ্ট বিন্যাসের পরে স্ট্রিং মুদ্রণের জন্য কিছু কৃত্রিম টাস্ককে স্যাট করা নয়। উদ্দেশ্যটি হ'ল আইওসিসি -র বাইরের আসল শব্দের অ্যাপ্লিকেশনগুলি প্রোগ্রামটির কোন সি সংস্করণটি সংকলিত হয়েছিল তা মুদ্রণ করে। "C89" বা "এএনএসআই-সি" এর চেয়ে C90 ব্যবহার করা আরও সঠিক।
লন্ডিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.