Вывод не дает значения мусора

#c

#c

Вопрос:

Добрый вечер, ребята, это небольшая программа, показанная ниже. Я ищу значение мусора b при каждом выполнении, но получаю тот же ответ. Код прост следующим образом:

 #include<stdio.h>
#include<conio.h>

int main(void)
{
    int a = 300, b,c;
    if (a>=400)
    b=300;
    c=200;
    printf("n%dn%d",b,c);
    getch();
 }
 

Ввод / вывод в Codeblocks выглядит следующим образом

 2
200
 

но если я удалю строку

 b=300;
 

сохраняя точку с запятой, он выдает мусорные значения.

Почему происходит это противоречие?

Комментарии:

1. Неопределенное поведение — это просто неопределенное поведение. Не гарантируется, что оно будет «неправильным», «случайным», «мусорным» или чем-то еще.

2. Влияет ли здесь условие «if» на выполнение и присвоение значения b?

3. @userXXX да, это так.

Ответ №1:

Для чтения неинициализированной переменной следуйте приведенным ниже правилам,

Статическая переменная по умолчанию инициализируется нулем, что означает локальную статическую или переменную области видимости файла (глобальную).

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

Он просто выдаст вам последнее значение, которое было сохранено в этой позиции в стеке (или в этом регистре, если переменная хранится в регистре).

Также undefined может отличаться у разных компиляторов.

Ответ №2:

Здесь 2 — это только мусор, вы должны напечатать значение b перед ‘if-statement’ и посмотреть, совпадает ли оно с последним оператором печати. Если оно совпадает, то оба значения являются мусорными, и с ними не произошло никаких изменений из-за «if-statement».

Вопрос о том, как компилятор генерирует мусорное значение, непредсказуем / случаен.

Комментарии:

1. Привет, я только что сделал то, что вы сказали, и его вывод отображается как: 2

2. Тогда 2 — это мусор, который генерирует ваш компилятор. На моей машине компилятор генерирует 482 как значение b .

3. хорошо, я понял. Еще одна вещь, обратите внимание на эту немного измененную программу верхней версии: #include<stdio.h> #include<conio.h> int main(void) { int a = 300, b,c; printf(«%d «,b); if (a> = 400) ; printf(«%d%d», b, c); getch(); } Здесь я получаю постоянное значение b для каждого выполнения, но c меняется. Есть ли какая-либо концепция или просто случайное поведение компилятора.

Ответ №3:

Объяснение:

Шаг 1: int a = 300, b, c; здесь переменная a инициализируется '300' , переменная b и c объявляются, но не инициализируются.

Шаг 2: if(a >= 400) средства if(300 >= 400) . Следовательно, это условие будет выполнено с ошибкой.

Шаг 3: c = 200; здесь переменная c инициализируется '200' .

Шаг 4: printf("%d, %d, %dn", a, b, c); он печатает "300, garbage value, 200" . потому что переменная b не инициализирована.