เอาต์พุตโปรแกรมด้านล่าง 'C89' เมื่อรวบรวมในโหมด C89 และ `C99` เมื่อรวบรวมในโหมด C99 อย่างไร


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
Paul R

4
เคล็ดลับที่ดี - gccแต่ก็ล้มเหลวด้วย หากไม่มีstd=c99คุณจะได้รับคำเตือนและหากคุณไม่สนใจก็gccจะยังคงตีความ//จุดเริ่มต้นของความคิดเห็น (อา - คุณต้องใช้-pedanticเช่นกันฉันมีสิ่งนั้นเป็นค่าเริ่มต้น)
usr2564301

3
@Jongware อืมฉันได้รับC89อย่างชัดเจนstd=c89ใน gcc 4.9.2
ikh

60
ในกรณีที่มีคนพบสิ่งนี้ในขณะที่ค้นหาวิธีการทดสอบสำหรับการสนับสนุน C99; โปรดใช้สิ่งที่ชอบ#if __STDC_VERSION__ >= 199901Lไม่ใช่//เคล็ดลับการแสดงความคิดเห็น =)
Arkku

10
นอกจากนี้ยังพิมพ์ "C99" สำหรับ C11 ...
Lundin

คำตอบ:


133

C99 อนุญาตให้//แสดงความคิดเห็นในสไตล์ 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;
}

ข้อผิดพลาดในคำตอบของคุณคุณจะได้รับ 90 เมื่อมันควรจะพิมพ์ 89?
Pimgd

1
@Pimgd C89 และ C90 เป็นสิ่งเดียวกัน stackoverflow.com/questions/17206568/...
Lundin

3
พวกเขาหมายถึงสิ่งเดียวกัน แต่ไม่ใช่สายเดียวกัน ยืนตามคำถามเดิมของฉัน
Pimgd

@Pimgd วัตถุประสงค์ของรหัสข้างต้นไม่ได้ป้อยองานประดิษฐ์บางอย่างเพื่อพิมพ์สตริงหลังจากรูปแบบที่กำหนด จุดประสงค์คือเพื่อแสดงให้เห็นว่าแอปพลิเคชันคำศัพท์จริงนอกIOCCCพิมพ์ว่าโปรแกรม C รุ่นใดที่คอมไพล์ด้วย C90 นั้นถูกต้องกว่าการใช้มากกว่า "C89" หรือ "ANSI-C"
Lundin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.