std::showpos непонятно вообще
size_t a = 0, b = 2;
long long diff = (long long)b-a;
std::cout << " var: " << std::showpos << diff << std::endl;
std::cout << "inline: " << std::showpos << (long long)b-a << std::endl; VVV
var: +2
inline: 2 WTF?
long long diff = дает long long переменную
auto diff = дает undigned long long
Вот со второй манипулятор не работает (очевидно решили что если программист работает с неподписанными типами, пусть сам плюсик рисует).
Да, уже расковыряли это...
Мне ещё нравится ответ нейросети. В нём - всё, что нужно знать о нейросетях.
это как-то контр-интуитивно. cppreference пишут, что showpos включает показ + для положительных значений, беззнаковый тип как раз представляет положительные значения.
std::showpos явно показывает знак перед положительным числом. то есть, если мы напишем:
std::cout << 2 << std::endl; получим просто '2'
но если напишем:
std::cout << std::showpos << 2; получим '+2'
Продолжайте наблюдение. Мы с вами свяжемся. Свободны.
📘 Что делает std::showpos в C++?
std::showpos — это манипулятор потока, который включает отображение знака + перед положительными числами при выводе через std::cout.
👇 Почему var = +2, а inline = 2?
Разберём строчки кода:
cpp
Копировать
Редактировать
long long diff = (long long)b - a; // b = 2, a = 0 → diff = 2
std::cout << " var: " << std::showpos << diff << std::endl;
std::cout << "inline: " << std::showpos << (long long)b - a << std::endl;
Разница — в порядке применения std::showpos:
✅ Первая строка:
cpp
Копировать
Редактировать
std::cout << std::showpos << diff;
std::showpos применяется к diff, который — готовое значение 2
результат: +2
❌ Вторая строка:
cpp
Копировать
Редактировать
std::cout << std::showpos << (long long)b - a;
Здесь важна приоритетность операторов!
<< имеет более высокий приоритет, чем -
так что компилятор читает это как:
cpp
Копировать
Редактировать
(std::cout << std::showpos << (long long)b) - a;
то есть:
std::showpos применяется к b = 2, выводится +2
потом - a — уже не участвует в выводе, а просто вычитается из cout, что логически бессмысленно, но технически возможно, т.к. operator- не перегружен.
Итог — a просто игнорируется, а b выводится как +2 → но минус “съедается”, и остаётся 2 без плюса.
💡 Как правильно:
Чтобы std::showpos применялся ко всему выражению (b - a) — возьми скобки:
cpp
Копировать
Редактировать
std::cout << "inline: " << std::showpos << ((long long)b - a) << std::endl;
Теперь будет правильно: inline: +2
🧠 Вывод:
Код Результат
<< std::showpos << diff +2
<< std::showpos << (b - a) ❌ (не работает как ожидаешь)
<< std::showpos << ((b - a)) ✅ +2
GLAVQA. Здесь дают ответы.
std::showpos лучше применять к именованным переменным.
ок, где в стандарте это указано? да и какая нафиг разница, в оператор передается уже результат вычисления, почему оно не в состоянии оценить этот результат? какая то тупость.
Это чушь.
это чтоб плюсики перед цифрами показывало типа +5 а не просто 5 воть
я в курсе, но какого Х оно тот плюсик не показывает при инлайн вычислениях.
Это казахский?
бурятский, бл