Aşağıdaki program, C89 modunda derlendiğinde "C89" ve C99 modunda derlendiğinde "C99" çıktıını nasıl verir?


128

Bu C programını web'den buldum:

#include <stdio.h>

int main(){

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

    return 0;
}

Bu programla ilgili ilginç olan şey, derlendiğinde ve C89 modunda çalıştırıldığında, yazdırması C89ve C99 modunda derlenip çalıştırıldığında yazdırmasıdır C99. Ancak bu programın nasıl çalıştığını çözemiyorum.

printfYukarıdaki programdaki ikinci argümanın nasıl çalıştığını açıklayabilir misiniz ?


47
İpucu: C ++ tarzı //yorum C99'da tanıtıldı.
Paul R.

4
Güzel numara - ama başarısız oluyor gcc. Olmadan std=c99bir uyarı alırsınız ve bunu göz ardı edersek, gccolacak hala yorumlamak //bir yorumun başlangıcından olarak (ah - Kullanmak zorunda -pedantic. Yanı ben varsayılan olarak bu var.)
usr2564301

3
@Jongware Eh, gcc 4.9.2'de C89açıkça anladım std=c89.
ikh

60
Birinin bunu C99 desteğini test etmenin bir yolunu ararken bulması durumunda; lütfen yorum hilesi #if __STDC_VERSION__ >= 199901Ldeğil gibi bir şey kullanın //. =)
Arkku

10
Aynı zamanda C11 için "C99" yazdırır ...
Lundin

Yanıtlar:


133

C99 //-stilli yorumlara izin verir , C89 izin vermez. Yani, çevirmek için:

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

satır yorumu //C99'dan beri tanıtıldı. Bu nedenle kodunuz C89'da buna eşittir

#include <stdio.h>

int main(){

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

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

ve buna C99'da eşit

#include <stdio.h>

int main(){

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

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

9

Çünkü //açıklamalar yalnızca C99 ve üstü standartlarda var, kod aşağıda eşdeğerdir:

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

Doğru kod şu şekilde olacaktır:

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

cevabınızda tek tek hata, 89 yazdırması gerektiğinde nasıl 90 elde edersiniz?
Pimgd

1
@Pimgd C89 ve C90 aynı şeydir. stackoverflow.com/questions/17206568/…
Lundin

3
Aynı şeyi kastediyorlar ama aynı dizi değil. Asıl sorumun yanında duruyorum.
Pimgd

@Pimgd Yukarıdaki kodun amacı, belirli bir biçimden sonra dizeleri yazdırmak için bazı yapay görevleri yerine getirmek değildir. Amaç, IOCCC dışındaki gerçek kelime uygulamalarının programın hangi C versiyonuyla birlikte derlendiğini nasıl yazdırdığını göstermektir. C90, "C89" veya "ANSI-C" den daha doğrudur.
Lundin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.