2013-10-13 2 views
-3
int main() 
{ 
    float a=4; 
    int b=2; 
    printf("%d\n",(a/b)); 
    printf("%f",(a/b)); 
    return 0; 
} 

Первый оператор printf снова печатает разные значения снова. Я знаю, что это потому, что я использую спецификатор% d для числа типа float. Но я не знаю, как работает. Кроме того, когда я меняюсь первую строку:Как этот код работает на самом деле?

int a=4; 

то второе утверждение печати

0.000000 

снова и again.Then почему это первая Printf в первом коде печати diffrent значения, но в второй оператор второго кода, он печатает одно и то же значение? Может ли кто-нибудь объяснить мне?

+0

Можете ли вы вставить выходные данные? – Kunal

+0

Использование% d для печати float вызывает неопределенное поведение. Поэтому, независимо от эффекта программы, это правильно. –

ответ

5

Разделение int на int дает int. Разделение float на int дает float.

Для int, используйте %d. Для float используйте %f. Если вы их смешиваете, вы получаете мусор.

+0

Я уже знаю это. Вещь, которую я хочу знать, - это то, почему она дает хлам. Как число с плавающей точкой сохраняется в памяти. И когда мы используем спецификатор% d, то как он интерпретирует его как целое. Можете ли вы рассказать мне, как работают спецификаторы? –

+2

То, что вы делаете, не определено, что означает, что оно зависит от конкретных деталей реализации и может делать что угодно (включая сбой и худшее). Если вы хотите получить подробные сведения, используйте отладчик, чтобы печатать память по частям, посмотреть, как хранится целое число и как хранится float, и посмотреть, что вы получаете, когда смотрите на float, как если бы оно было целым числом. – ugoren

3

a/b даст вам float (и получает повышение до double). Печать его с помощью спецификатора %d вызовет неопределенное поведение.

Тогда почему первый printf в первом коде печатает разные значения, но во втором выражении второго кода он печатает то же значение? Может ли кто-нибудь объяснить мне?

Это связано с неопределенным поведением. В этом случае иногда вы можете получить ожидаемый результат, иногда результат - то, что я ожидал, а иногда и то, что ожидает компилятор.

+1

'a/b' является' float', но его повышают до 'double'. +1 для упоминания UB в любом случае. –

+0

Это не определено в разных средах. Может быть, ОП спрашивает, почему это не согласуется в той же среде. Может быть, этот код в его окружении делает доступ к области памяти не инициализированной и, следовательно, дает разные результаты в каждом проходе? Однако результат согласован с разными проходами в моей системе (подчеркивание UB). – pinkpanther

Смежные вопросы