Рубрики

Вывод программ на C | Комплект 6

Прогнозировать выход следующих программ

Вопрос 1

int main()

{

    unsigned int i=65000;

    while ( i++ != 0 );

    printf("%d",i);

    return 0;

}

Выход:
1

Объяснение:
Следует отметить, что в теле цикла while стоит точка с запятой. Таким образом, даже если ничего не сделано как часть тела while, управление выйдет из состояния while, только если условие не будет выполнено. Другими словами, как только i внутри условия станет равным 0, условие станет ложным, и пока цикл завершится. Но также обратите внимание на оператор постинкремента в состоянии while. Поэтому сначала меня будут сравнивать с 0, и я буду увеличиваться независимо от того, выполнено условие или нет. Поскольку я инициализирован в 65000, он будет увеличиваться до тех пор, пока не достигнет наивысшего положительного значения. После этого происходит переворачивание, и значение i становится равным нулю. Условие не выполнено, но я буду увеличиваться, т.е. до 1. Затем printf выведет 1.

вопрос 2

int main()

{

    int i=0;

    while ( +(+i--) != 0)

        i-=i++;

    printf("%d",i);

    return 0;

}

Выход:
-1

Объяснение:
Давайте сначала возьмем условие цикла while. Там есть несколько операторов. Унарный + оператор ничего не делает. Таким образом, упрощенное условие становится (i–)! = 0. Поэтому я буду сравниваться с 0 и затем уменьшаться независимо от того, является ли условие истинным или ложным. Так как я инициализирован в 0, условие while будет ложным на самой первой итерации, но я буду уменьшен до -1. Тело цикла while не будет выполнено. И printf напечатает -1.

Так что это было не так страшно, как казалось!

Вопрос 3

int main()

{

    float f=5,g=10;

    enum{i=10,j=20,k=50};

    printf("%d\n",++k);

    printf("%f\n",f<<2);

    printf("%lf\n",f%g);

    printf("%lf\n",fmod(f,g));

    return 0;

}

Выход:
Программа не скомпилируется и выдаст 3 ошибки

Объяснение:
Здесь i, j и k находятся внутри перечисления и, следовательно, они как константы. Другими словами, если вы хотите использовать 10 в любом месте программы, мы можем использовать i вместо этого. В первом printf значение k изменяется, что недопустимо, потому что это enum константа. Во втором printf оператор смещения влево применяется к плавающей точке, что также недопустимо. Аналогично, в третьем printf оператор модуля применяется к числам с плавающей запятой f и g, что также недопустимо.

Вопрос 4

   

int main()

{

    int i=10;

    void pascal f(int,int,int);

    f(i++, i++, i++);

    printf(" %d",i);

    return 0;

}

void pascal f(integer :i,integer:j,integer :k)

{

  write(i,j,k);

}

Выход:
Программа выдаст ошибку во время компиляции

Объяснение:
Компилятор конкретный вопрос. Не все компиляторы поддерживают это.

В противном случае Паскаль обеспечивает обработку аргументов слева направо. Поэтому, хотя порядок обработки аргументов можно изменить с помощью паскаля, мы не можем использовать такие процедуры языка Pascal, как запись в программе на Си.

Вопрос 5

void pascal f(int i,int j,int k)

{

  printf("%d %d %d",i, j, k);

}

  

void cdecl f(int i,int j,int k)

{

  printf("%d %d %d",i, j, k);

}

  
main()
{

    int i=10;

    f(i++,i++,i++);

    printf(" %d\n",i);

    i=10;

    f(i++,i++,i++);

    printf(" %d",i);

}

Выход:
Компилятор конкретный вопрос. Не все компиляторы допускают это.

Объяснение:
Этот вопрос касается механизма передачи аргументов. Если мы вызываем функцию, порядок, в котором обрабатываются аргументы функции, не регулируется стандартом Си. Таким образом, один компилятор может обрабатывать аргументы слева направо, в то время как другой компилятор может обрабатывать их справа налево. Обычно на программы это не влияет, потому что аргументы программ разные. Например, если мы называем функцию fun как fun (i, j), то независимо от того, в каком порядке обрабатываются аргументы, значения i и j будут согласованы.

Но в этом случае мы передаем аргументы функции f, используя ту же переменную. Таким образом, порядок, в котором аргументы обрабатываются функцией, будет определять значение этих аргументов. cdecl обеспечивает обработку аргументов справа налево, а pascal — обработку аргументов слева направо.

Таким образом, значения i, j и k внутри первой функции f будут 10, 11 и 12 соответственно, тогда как значения i, j и k внутри второй функции f будут 12, 11 и 10 соответственно.

Рекомендуемые посты:

Вывод программ на C | Комплект 6

0.00 (0%) 0 votes