Рубрики

Выход программы C | Набор 28

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

Вопрос 1

#include <stdio.h>

  

int main()

{

    char a = 30;

    char b = 40;

    char c = 10;

    char d = (a * b) / c;

    printf ("%d ", d);

  

    return 0;

}

На первый взгляд, выражение (a * b) / c, кажется, вызывает арифметическое переполнение, поскольку подписанные символы могут иметь значения только от -128 до 127 (в большинстве компиляторов C) и значение подвыражения '(a * b) 'равно 1200. Например, следующий фрагмент кода печатает -80 на 32-разрядной машине с прямым порядком байтов.

    char d = 1200;
    printf ("%d ", d);

Арифметическое переполнение не происходит в исходной программе, и результат программы равен 120. В C символы char и short преобразуются в int для арифметических вычислений. Таким образом, в выражении '(a * b) / c' a, b и c переводятся в int, и переполнения не происходит.

вопрос 2

#include<stdio.h>

int main()

{

    int a, b = 10;

    a = -b--;

    printf("a = %d, b = %d", a, b);

    return 0;

}

Выход:

a = -10, b = 9

Утверждение 'a = -b–;' компилируется нормально. Унарный минус и унарный декремент имеют сохраненный приоритет и ассоциативность справа налево. Поэтому '-b–' рассматривается как — (b–), что является действительным. Таким образом, -10 будет присвоено «a», а «b» станет 9.
Попробуйте следующую программу в качестве упражнения.

#include<stdio.h>

int main()

{

    int a, b = 10;

    a = b---;

    printf("a = %d, b = %d", a, b);

    return 0;

}

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

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

Выход программы C | Набор 28

0.00 (0%) 0 votes