2016-11-29 3 views
4

Мы с коллегой учимся на тесте, где мы должны проанализировать код C. Просматривая тесты от предыдущих лет, мы увидели следующий код, который мы действительно не понимаем:Расчет с поплавком в макросах в C

#include <stdio.h> 
#define SUM(a,b) a + b 
#define HALF(a) a/2 

int main(int argc, char *argv[]) 
{ 
    int big = 6; 
    float small = 3.0; 

    printf("The average is %d\n", HALF(SUM(big, small))); 
    return 0; 
} 

Этот код печатает 0, которые мы не понимаем вообще ... Можете ли вы объяснить это нам?

Большое спасибо!

+1

он должен делать с формата. –

+1

и переменные add() для макросов (например, '#define HALF (a) (a)/2') –

+0

[Необходимость скобок в макросах в C] (http://stackoverflow.com/q/10820340/ 995714). Даже если вы использовали исправление спецификатора формата, вы получите неожиданные результаты, если не ставите круглые скобки. Просто попробуйте и посмотрите –

ответ

3

Предупреждения компилятора (format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’) дают более-достаточную информацию. Вы должны исправить свой format-specifier, который должен быть %lf, а не %d, так как вы пытаетесь напечатать значение double.

printf("The average is %lf\n", HALF(SUM(big, small))); 

printf будет относиться к памяти вы указываете, как же вы прикажете это сделать. Здесь он обрабатывает память, которая представляет float как int. Поскольку они хранятся по-разному, вы должны получить то, что по сути является случайным числом. Он не обязательно должен быть 0.

+0

Спасибо за объяснение! – puer123

+1

просто '% f' достаточно –

+0

@Jarvis: терпение - это добродетель; люди должны подождать некоторое время, прежде чем им разрешат принять любой ответ (кажется, 15 минут). И вымогательство за принятие таких голосов спустя менее 10 минут действительно слишком нетерпеливо. Может быть, через пару часов. Конечно, сообщение «Спасибо» от новичков немного волнует; вы всегда можете указать их на часто задаваемые вопросы ([Как задать вопросы здесь?] (http://stackoverflow.com/help/how-to-ask) и [Что мне делать, когда кто-то отвечает на мой вопрос ? ] (http://stackoverflow.com/help/someone-answers)). –

0

Чтобы получить правильный вывод

  1. Добавить скобки в макро
  2. Используйте правильный формат спецификатора (%f)

исправленный код

#include <stdio.h> 

#define SUM(a, b) (a + b) 
#define HALF(a) a/2 

int main() { 
    int big = 6; 
    float small = 3.0; 
    printf("The average is %f\n", HALF(SUM(big, small))); 
    return 0; 
} 

Выход

The average is 4.500000 

Если вы не добавили круглые скобки, вывод будет 7.500000 из-за приоритета оператора.

В случае, если вам нужен целочисленный выход, отбрасывается до int перед печатью.

printf("The average is %d\n", (int)HALF(SUM(big, small))); 

Выход

The average is 4 

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

  • Нет связанных вопросов^_^