Top.Mail.Ru
Ответы

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

1234
     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

12
    var: +2 
inline: 2 

WTF?

По дате
По рейтингу
Аватар пользователя
Новичок
10мес

long long diff = дает long long переменную
auto diff = дает undigned long long
Вот со второй манипулятор не работает (очевидно решили что если программист работает с неподписанными типами, пусть сам плюсик рисует).

Аватар пользователя
Мыслитель
10мес

Да, уже расковыряли это...
Мне ещё нравится ответ нейросети. В нём - всё, что нужно знать о нейросетях.

Аватар пользователя
Просветленный
10мес

это как-то контр-интуитивно. cppreference пишут, что showpos включает показ + для положительных значений, беззнаковый тип как раз представляет положительные значения.

Аватар пользователя
Ученик
10мес

std::showpos явно показывает знак перед положительным числом. то есть, если мы напишем:

1
 std::cout << 2 << std::endl; 
  • получим просто '2'

  • но если напишем:

1
 std::cout << std::showpos << 2; 
  • получим '+2'

Аватар пользователя
Мыслитель
10мес

Продолжайте наблюдение. Мы с вами свяжемся. Свободны.

Аватар пользователя
Ученик
10мес

📘 Что делает 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. Здесь дают ответы.

Аватар пользователя
Мастер
10мес

std::showpos лучше применять к именованным переменным.

Аватар пользователя
Просветленный
10мес

ок, где в стандарте это указано? да и какая нафиг разница, в оператор передается уже результат вычисления, почему оно не в состоянии оценить этот результат? какая то тупость.

Аватар пользователя
Мыслитель
10мес

Это чушь.

Аватар пользователя
Ученик
10мес

это чтоб плюсики перед цифрами показывало типа +5 а не просто 5 воть

Аватар пользователя
Просветленный
10мес

я в курсе, но какого Х оно тот плюсик не показывает при инлайн вычислениях.

Аватар пользователя
10мес

Это казахский?

Аватар пользователя
Просветленный
10мес

бурятский, бл



Видео по теме