Как я могу определить, какому стандарту C соответствует этот код? - PullRequest
1 голос
/ 20 сентября 2010

В лаборатории C этот простой код появляется:

#include <stdio.h>

int suma (int a, int b)
{
        return a+b;
}

int mult (int a, int b)
{
        return a*b;
}

int main(void)
{
        int a,b;
        printf ("Operando 1: ");
        scanf("%d",&a);
        printf("Operando 2: ");
        scanf("%d",&b);
        printf("%d+%d=%d\n",a,b,suma(a,b));
        printf("%d*%d=%d\n",a,b,mult(a,b));
        return 0; 
}

, взглянув на код, который я должен определить, какому стандарту C он соответствует (ANSI, ISO или K & R de facto).После прочтения это и это я склонен сказать, что оно соответствует трем стандартам.Это было бы правильно?

Ответы [ 5 ]

7 голосов
/ 20 сентября 2010

Это не K & R.Объявления функций K & R определяют аргументы вне скобок следующим образом:

int mult (a, b)
    int a;
    int b;

и void не были введены с первым стандартом ANSI.

Мне кажется, что это совместимо как с ANSI C89, так и сC99.

4 голосов
/ 20 сентября 2010

Если вы используете gcc, с опциями -std=..., -Wall и -pedantic вы можете изменить ожидаемый стандарт и получать предупреждения / ошибки, если код не соответствует.

3 голосов
/ 20 сентября 2010

Я говорю C89 (ANSI C89 или ISO C90).

Это не является стандартным (K & R) C: определение функции имеет информацию о типе для параметров внутри объявления.

Он следует всем правилам стандарта C89 и всем правилам стандарта C99 (*). Однако стандарт C99 гласит, что main возвращает 0, если он достигает закрывающего } без оператора возврата. Итак, парень, который написал это , должен был добавить утверждение return 0; ... или вопрос не имеет особого смысла.

(*) первые 2 printf действительно должны иметь '\ n' (или вызывать fflush(stdout); впоследствии) для сброса вывода

2 голосов
/ 20 сентября 2010

K & R C не включает аргументы в объявлениях функций.

См., Например, текст Википедии об истории C *

0 голосов
/ 20 сентября 2010
#if __STDC_VERSION__ >= 199901L
puts("C99");
#else
puts("C89 or pre C89");
#endif

будет работать для компиляторов ANSI C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...