Рубрики

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

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

Вопрос 1

int main()

{

    while(1){

        if(printf("%d",printf("%d")))

            break;

        else

            continue;

    }

    return 0;

}

Выход:
Не может быть предсказано

Объяснение:
Условие в цикле while равно 1, поэтому на первый взгляд это выглядит как бесконечный цикл. Тогда есть разрыв и продолжение в теле цикла while, так что это может быть не бесконечный цикл. Оператор break будет выполнен, если будет выполнено условие в соответствии с if, в противном случае будет выполнено продолжение. Поскольку после продолжения в цикле while нет других операторов, continue не имеет смысла. На самом деле это постороннее. Итак, давайте посмотрим, если условие. Если мы внимательно посмотрим, мы заметим, что условие if будет выполняться всегда, поэтому break будет выполняться на самой первой итерации, и мы выйдем из цикла while. Причиной выполнения условия if является функция printf. Функция printf всегда возвращает no. из байтов у него есть выход. Например, возвращаемое значение printf («гики») будет 5, потому что printf выведет здесь 5 символов. В нашем случае внутренний printf будет выполнен первым, но этот printf не имеет аргумента для спецификатора формата, т.е.% d. Это означает, что этот printf напечатает любое произвольное значение. Но обратите внимание, что даже для любой произвольной стоимости, нет. из байтов, выводимых внутренним printf, будет отличным от нуля. А тех нет. байтов будет работать как аргумент для внешнего printf. Внешний printf напечатает так много нет. байтов и возвращают ненулевое значение всегда. Так что условие if также всегда верно. Следовательно, цикл while будет выполняться только один раз. В качестве примечания, даже без внешнего printf, условие if всегда истинно.

вопрос 2

int main()

{

    unsigned int i=10;

    while(i-- >= 0)

        printf("%u ",i);

    return 0;

}

Выход:
9 8 7 6 5 4 3 2 1 0 4294967295 4294967294 …… (на машине с длиной int 4 байта)

9 8 7 6 5 4 3 2 1 0 65535 65534…. (на машине, где int имеет длину 2 байта)

Объяснение:
Давайте рассмотрим условие цикла while. Очевидно, что при выполнении условия цикла while будет выполняться printf. В условии цикла while есть два оператора: оператор после декремента и оператор сравнения. Из приоритета операторов мы знаем, что унарный оператор пост-декремента имеет более высокий приоритет, чем оператор сравнения. Но из-за свойства после декремента значение i будет уменьшаться только после того, как оно было использовано для сравнения. Таким образом, на первой итерации условие выполняется, потому что 10> = 0, а затем i уменьшается. Поэтому 9 будет напечатано. Точно так же цикл продолжается, и значение i продолжает уменьшаться. Давайте посмотрим, что произойдет, когда условие цикла while станет 0> = 0. В это время условие выполнено и i уменьшено. Поскольку я — целое число без знака, происходит переворачивание, и я принимаю значение наибольшего значения + ve, которое может принять целое число без знака. Так что я никогда не бывает отрицательным. Следовательно, он становится бесконечным в то время как цикл.

Как примечание, если бы я был подписан int, цикл while был бы прерван после печати наибольшего отрицательного значения.

Вопрос 3

int main()

{

    int x,y=2,z,a;

    if ( x = y%2) 

         z =2;

    a=2;

    printf("%d %d ",z,x);

    return 0;

}

Выход:
<некоторое значение мусора z> 0

Объяснение:
Этот вопрос имеет некоторые вещи для приоритета операторов. Если условие if выполнено, то z будет инициализировано как 2, иначе z будет содержать значение мусора. Но условие if имеет два оператора: оператор присваивания и оператор модуля. Приоритет модуля выше, чем присваивание. Таким образом, y% 2 равно нулю, и он будет присвоен х. Таким образом, значение x становится нулевым, что также является эффективным условием для if. И, следовательно, условие if ложно.

Вопрос 4

   

int main()

{

    int a[10];

    printf("%d",*a+1-*a+3);

    return 0;

}

Выход: 4

Объяснение:
Исходя из приоритета оператора, оператор разыменования имеет более высокий приоритет, чем оператор сложения / вычитания. Таким образом, удаление ссылки будет применено первым. Здесь a — массив, который не инициализирован. Если мы используем a, то он будет указывать на первый элемент массива. Поэтому * a будет первым элементом массива. Предположим, что первым элементом массива является x, а затем аргумент внутри printf становится следующим. Это эффективное значение 4.

х + 1 — х + 3 = 4

Вопрос 5

#define prod(a,b) a*b

int main()

{

    int x=3,y=4;

    printf("%d",prod(x+2,y-1));

    return 0;

}

Выход:
10

Объяснение:
Эта программа имеет дело с макросами, их побочными эффектами и приоритетом операторов. Здесь prod — это макрос, который умножает два аргумента a и b. Давайте посмотрим поближе.

прод (а, б) = а * б
прод (х + 2, у-1) = х + 2 * у-1 = 3 + 2 * 4-1 = 3 + 8-1 = 10

Если программист действительно хотел умножить x + 2 и y-1, он должен был поставить круглые скобки вокруг a и b следующим образом.

prod (a, b) = (a) * (b)

Этот тип ошибки в макроопределении называется — макро-побочные эффекты.

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

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

0.00 (0%) 0 votes