Добавил:
Рад, если кому-то помог Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
01.11.2025
Размер:
4.53 Кб
Скачать
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int a, b = 5, c;
    double x, y = -.5, z;
    
    printf("a=");
    scanf("%d", &a);  // Пусть a = 3
    
    // Анализ: x = c = a;
    c = a;  // c = 3
    x = c;  // x = 3.0 (неявное приведение int к double)
    printf("x = c = a : a=%d c=%d x=%f\n", a, c, x);  // a=3 c=3 x=3.000000
    
    // Анализ: a += b;
    a = a + b;  // a = 3 + 5 = 8
    printf("a += b : a=%d\n", a);  // a=8
    
    // Анализ: x *= b + a;
    x = x * (b + a);  // x = 3.0 * (5 + 8) = 3.0 * 13 = 39.0
    printf("x *= b+a : x=%lf\n", x);  // x=39.000000
    
    // Анализ: b += a--;
    // Сначала b = b + a, потом a уменьшается на 1
    b = b + a;  // b = 5 + 8 = 13
    a = a - 1;  // a = 8 - 1 = 7
    printf("b += a-- : a=%d b=%d\n", a, b);  // a=7 b=13
    
    // Анализ: x -= ++c;
    // Сначала c увеличивается на 1, потом x = x - c
    c = c + 1;  // c был 3, стал 4
    x = x - c;  // x = 39.0 - 4 = 35.0
    printf("x -= ++c : c=%d x=%lf\n", c, x);  // c=4 x=35.000000
    
    // Анализ: c = a/b;
    // Целочисленное деление: 7 / 13 = 0
    c = a / b;  // c = 7 / 13 = 0
    printf("c = a/b : c=%4d\n", c);  // c=   0
    
    // Анализ: c = a%b;
    // Остаток от деления: 7 % 13 = 7
    c = a % b;  // c = 7
    printf("c = a%%b : c=%d\n", c);  // c=7
    
    // Анализ: y += (a+1)/a++;
    // Поведение неопределенное из-за изменения и использования a в одном выражении
    // В зависимости от компилятора результат может различаться
    int temp1 = a + 1;  // 7 + 1 = 8
    int temp2 = a;      // 7
    a = a + 1;          // a = 8
    y = y + (double)temp1 / temp2;  // y = -0.5 + 8/7 ≈ -0.5 + 1.142857 = 0.642857
    printf("y += (a+1)/a++ : a=%d y=%.31f\ty=%.01f\n", a, y, y);  // a=8 y=0.642857 y=0.6
    
    // Анализ: b = 3*(y -=.6)+2*b+1;
    y = y - 0.6;        // y = 0.642857 - 0.6 = 0.042857
    b = 3 * y + 2 * b + 1;  // b = 3*0.042857 + 2*13 + 1 ≈ 0.128571 + 26 + 1 = 27.128571 → 27 (целое)
    printf("b = 3*(y -=.6)+2*b+1 : b=%d y=%.11f\n", b, y);  // b=27 y=0.042857
    
    // Анализ: z = a/2;
    // Целочисленное деление: 8/2=4, затем преобразование в double
    z = a / 2;  // z = 8/2 = 4 → 4.0
    printf("z = a/2 : z=%lf\n", z);  // z=4.000000
    
    // Анализ: z = (double)a/2;
    // Вещественное деление: 8.0/2=4.0
    z = (double)a / 2;  // z = 4.0
    printf("z = (double)a/2 : z=%lf\n", z);  // z=4.000000
    
    // Анализ: y = (x = 5.7)/2;
    x = 5.7;            // x = 5.7
    y = x / 2;          // y = 5.7/2 = 2.85
    printf("y = (x = 5.7)/2 : x=%lf y=%lf\n", x, y);  // x=5.700000 y=2.850000
    
    // Анализ: y = (int)x/2;
    // Приведение x к int: 5.7 → 5, затем целочисленное деление 5/2=2
    y = (int)x / 2;     // y = 5/2 = 2 → 2.0
    printf("y = (int)x/2 : y=%f\n", y);  // y=2.000000
    
    // Анализ сложного выражения с разбивкой:
    // z = (b-3)/2 - x/5 + (c/=2) + 1/4*z - y++ + ++b/3.;
    int b_old = b;      // b=27
    double y_old = y;   // y=2.0
    
    // Вычисляем по частям согласно приоритету операций
    int part1 = (b - 3) / 2;    // (27-3)/2 = 24/2 = 12
    double part2 = x / 5;        // 5.7/5 = 1.14
    c = c / 2;                   // c=7/2=3 (целочисленное деление)
    int part3 = c;               // part3=3
    double part4 = 1 / 4 * z;    // 1/4=0 (целое), 0*z=0.0
    double part5 = y_old;        // y++ - используем старое значение y=2.0
    y = y + 1;                   // y увеличивается после использования
    b = b + 1;                   // ++b - сначала увеличиваем b=28
    double part6 = b / 3.0;      // 28/3.0 ≈ 9.333333
    
    z = part1 - part2 + part3 + part4 - part5 + part6;
    // z = 12 - 1.14 + 3 + 0 - 2.0 + 9.333333 ≈ 21.193333
    
    printf("z = ... : a=%d b=%d c=%d x=%lf y=%lf z=%lf\n", a, b, c, x, y, z);
    
    system("pause");
    return 0;
}
Соседние файлы в папке Лаба1