2013-11-13 12 views
-3
#include<stdio.h> 
#define square(x) x*x 

    void main() 
    { 
     int i; 
     i = 8/square(4); 
     printf("%d %d", i, 8/square(4)); 
    } 

дает выход: 8 8Printf дает неправильный выход

, но если я напишу ниже код:

#include<stdio.h> 
#define square(x) x*x 

    void main() 
    { 
     float i; 
     i = 8/square(4); 
     printf("%f %f", i, 8/square(4)); 
    } 

дает выход: 8,000000 0,000000

Почему так ??? пожалуйста, объясните

+0

Использование чисел с плавающей точкой буквальным, если вы указали '% f'. '8.0f/квадрат (4.0f)'. – sgarizvi

+2

ВСЕГДА старайтесь использовать макросы с необходимыми скобками, чтобы облегчить жизнь! –

+4

'int main()' ... Приоритет оператора ... Неверный спецификатор формата ... ** Вы даже потрудились прочитать базовый учебник C? ** –

ответ

0

Первое легко понять, поэтому я сосредотачиваюсь только на втором. Вы используете% f для второго параметра, для которого требуется число с плавающей точкой, в то время как компилятор C принимает 8/square (4) как целое. Это несоответствие испортило ваш результат.

0

8/square(4) Результаты int и попытка печати целого числа с использованием %f - Undefined behavior. Поэтому нет необходимости отлаживать значение, которое вы получили во втором случае.

Если вы используете компилятор gcc, тогда команда cc -E filename.c может прояснить ваши сомнения.

0

Это потому, что вы дали float как тип данных во второй программе.

8/square (4) даст целочисленный результат, и, следовательно, ваш выход станет неправильным. вы использовали% f для печати целого числа.

Это так просто ...

1

Прежде всего это исправить:

#define square(x) x*x 

в

#define square(x) ((x)*(x)) 

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

Теперь, в вашей первой программе, как объяснили другие, вы используете неправильный спецификатор формата %f для печати целого числа (8/(square(4) будет оценивать целое число), что является неопределенным поведением.

Во второй программе 8/square(4) относится к категории float, так как вы храните результат в float i. Поэтому при первой печати вы получаете 8.000000. При второй печати результат неправильный по той же причине, что и выше.

2

Проблемы не только с спецификатор формата, но и то, как вы определили ваш макрос, он должен быть:

#define square(x) ((x)*(x)) 

Также макросы не типобезопасен. Теперь, если вы произнесете свои результаты, вы увидите, что происходит, так как квадрат 4 равен 16 - 8/16 равен 0,5, который усекается до int, следовательно, становится 0.Для собственных значений это, как вы должны типаж:

printf("%d %d", (int)i, (int)(8/square(4))); 
printf("\n%f %f", (float)i, (float)8/((float)square(4))); 

Sample Output:

0 0 
0.000000 0.500000 
0

потому, что% е означает тип номера в два раза и по умолчанию точность

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