Странное литье любопытства в C

0

Я начинаю программировать на компьютере, занимаюсь этим только на базовых языках пару лет, и теперь я перехожу на более сложные языки, такие как C и C++.

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

#include <stdio.h>;
#include <math.h>;
#define pi 3.14
#define abs(v)(v<0?-v:v)
int main()
{
printf("%d",(int)ceil(abs(pi)));
}

Теперь, это мое размышление. Почему это так,

printf("%d",(int)ceil(abs( pi )));

возвращает 4, как следует,

но когда я размещаю оператор трансляции так:

printf("%d",ceil((int)abs( pi )));

он возвращает 0?

Для меня это не имеет смысла, поскольку он должен возвращать 4 в любом случае, поскольку (int) abs (pi) возвращает 3, но он все еще приостанавливается. Так что в сущности это должно сказать, хорошо, я схватил 3 как литой int abs (pi), и теперь я его закрыл, поэтому он должен вернуться 4.

Но nooo возвращает 0.

не должны

(int) ceil(abs( pi )) 

эквивалентны

ceil( (int) abs( pi ) ) ? ?

Если бы только программирование было так просто, как сказать: "СДЕЛАЙТЕ ЭТО СИТУАЦИЮ", а затем внезапно все работает безупречно.

  • 0
    Наилучшим решением для такого рода проблем является включение всех предупреждений и указание компилятору рассматривать их как ошибки (потому что они действительно есть). И эй, нет необходимости ставить ; после # директив!
  • 0
    @ user3125367 В этом случае это не принесет ему пользы, потому что у printf нет безопасности типов.
Показать ещё 3 комментария
Теги:

1 ответ

6

Попробуйте изменить:

printf("%d",ceil((int)abs( pi )));

... чтобы:

printf("%f",ceil((int)abs( pi )));

Ваша текущая проблема почти наверняка связана с тем, что ceil возвращает double но вы говорите printf чтобы ожидать int.

Конечно, для C++ пропустите все это и используйте:

std::cout << ceil((int)abs( pi ));

или:

std:cout << ceil(static_cast<int>(abs(pi)));

... и пусть компилятор отслеживает правильный тип преобразования.

Для чего это стоит, я ожидаю, что это произведет 3, а не 4. Преобразование в int будет усекать Pi до 3. Затем будет преобразован в двойной. Поскольку он не имеет дробной части, его ceil останется 3.

  • 0
    Но тогда почему это работает в одну сторону, а не в другую? : D Выводит 4
  • 0
    @ user3317781: потому что в другом коде вы преобразуете результат из ceil в int , поэтому в printf было передано int , то есть тот тип, который он ожидает для преобразования формата %d .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню