Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

std::showpos непонятно вообще

/bin/laden Искусственный Интеллект (122576), закрыт 3 недели назад
     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?
Лучший ответ
Сергей Гений (60598) 3 недели назад
long long diff = дает long long переменную
auto diff = дает undigned long long
Вот со второй манипулятор не работает (очевидно решили что если программист работает с неподписанными типами, пусть сам плюсик рисует).
ПапаВысший разум (154746) 3 недели назад
Да, уже расковыряли это...
Мне ещё нравится ответ нейросети. В нём - всё, что нужно знать о нейросетях.
Сергей Гений (60598) Папа, На cplusplus описание не очевидное: "every non-negative numerical value". Выходит что 5U - это уже не "не негативное" значение...
/bin/ladenИскусственный Интеллект (122576) 3 недели назад
это как-то контр-интуитивно. cppreference пишут, что showpos включает показ + для положительных значений, беззнаковый тип как раз представляет положительные значения.
Сергей Гений (60598) /bin/laden, Да, для кожаных мешков unsigned - это положительные, а для стальных задов - неподписанные )
Остальные ответы
Noreen Judd Знаток (466) 3 недели назад
это чтоб плюсики перед цифрами показывало типа +5 а не просто 5 воть
/bin/ladenИскусственный Интеллект (122576) 3 недели назад
я в курсе, но какого Х оно тот плюсик не показывает при инлайн вычислениях.
Папа Высший разум (154746) /bin/laden, настройка скидывается после вывода каждой чиселки. Надо заново указывать перед следующим значением.
Rainbow666 Просветленный (21234) 3 недели назад
std::showpos лучше применять к именованным переменным.
/bin/ladenИскусственный Интеллект (122576) 3 недели назад
ок, где в стандарте это указано? да и какая нафиг разница, в оператор передается уже результат вычисления, почему оно не в состоянии оценить этот результат? какая то тупость.
Rainbow666 Просветленный (21234) /bin/laden, https://eel.is/c++draft/ нет явного указания на то, что std::showpos должен игнорироваться для rvalue-выражений. просто плюс юзать для prvalue
 std::cout << std::showpos << +( (long long)b - a ); 
иногда помогает
ПапаВысший разум (154746) 3 недели назад
Это чушь.
Rainbow666 Просветленный (21234) Папа, окс
@GLAVQA Профи (788) 3 недели назад
? Что делает 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. Здесь дают ответы.
Никита Рамилиев Знаток (377) 3 недели назад
std::showpos явно показывает знак перед положительным числом. то есть, если мы напишем:
 std::cout << 2 << std::endl; 
  • получим просто '2'
  • но если напишем:
 std::cout << std::showpos << 2; 
  • получим '+2'
ПапаВысший разум (154746) 3 недели назад
Продолжайте наблюдение. Мы с вами свяжемся. Свободны.
Похожие вопросы