Почему vector.size()-1 дает значение мусора?

Я пытался запустить этот код

// vector::size
#include <iostream>
#include <vector>

int main ()
{
   std::vector<int> myints;
   std::cout << "size: " << myints.size() << '\n';
   std::cout << "size: " << myints.size()-1 << '\n';

 return 0; 
}

И Удивительно выход пришел

0

стоимость мусора

Должен быть

0

-1

Вот :код


person JVJplus    schedule 06.02.2018    source источник
comment
Посмотрите на тип.   -  person chris    schedule 06.02.2018
comment
Я серьезно сомневаюсь, что ваша программа буквально выводит мусорное значение.   -  person molbdnilo    schedule 06.02.2018
comment
Так не должно быть. Это беззнаковый тип, отрицательных значений нет.   -  person Justin Randall    schedule 06.02.2018
comment
@molbdnilo: Хороший вопрос. Мне нужно проверить, но я думаю, что поведение cout является реализацией, определенной для типов unsigned определенного размера. Кажется, что теоретически стандарт допускает мусорное значение.   -  person Bathsheba    schedule 06.02.2018
comment
@Bathsheba, насколько я могу судить по operator<< и num_put::do_put, unsigned long long с другими настройками по умолчанию будет выводиться так же, как вызов printf("%ull", val), а также для других основных беззнаковых типов. Я не уверен, что у вас есть потенциальная проблема из-за size_t, учитывая, что это либо соответствует перегрузке, либо вызывает двусмысленность.   -  person chris    schedule 06.02.2018


Ответы (1)


myints.size() — это беззнаковый тип: формально std::vector<int>::size_type. Вычитание 1 из беззнакового типа со значением 0 приведет к тому, что в вашем случае эффекты переноса будут

std::numeric_limits<std::vector<int>::size_type>::max()

Было бы напечатано не "мусорное значение", а приведенное выше число, которое будет на единицу меньше, чем большая степень числа 2.

person Bathsheba    schedule 06.02.2018