Я начинаю программировать на компьютере, занимаюсь этим только на базовых языках пару лет, и теперь я перехожу на более сложные языки, такие как 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 ) ) ? ?
Если бы только программирование было так просто, как сказать: "СДЕЛАЙТЕ ЭТО СИТУАЦИЮ", а затем внезапно все работает безупречно.
Попробуйте изменить:
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
.
ceil
в int
, поэтому в printf
было передано int
, то есть тот тип, который он ожидает для преобразования формата %d
.
;
после#
директив!