Проблема с вектором <bool>и printf - PullRequest
2 голосов
/ 25 августа 2011
#include <vector>
#include <iostream>
#include <stdio.h>
using namespace std;
int main(int argc, const char *argv[])
{
    vector<bool> a;
    a.push_back(false);
    int t=a[0];
    printf("%d %d\n",a[0],t);
    return 0;
}

Этот код выдает «5511088 1». Я думал, что это будет "0 0".

Кто-нибудь знает, почему это так?

Ответы [ 3 ]

9 голосов
/ 25 августа 2011

Спецификатор формата %d предназначен для аргументов размером целых чисел, поэтому функция printf ожидает два аргумента, оба размером int. Однако вы предоставляете ему один аргумент, который не int, а специальный объект, возвращаемый vector<bool>, который можно преобразовать в bool.

Это в основном заставляет функцию printf обрабатывать случайные байты из стека как часть значений, хотя на самом деле это не так.

Решение состоит в том, чтобы привести первый аргумент к int:

printf("%d %d\n", static_cast<int>(a[0]), t);

Еще лучшим решением было бы предпочесть потоки, а не printf, если это вообще возможно, потому что в отличие от printf они безопасны от типов, что делает невозможным возникновение такой ситуации:

cout << a[0] << " " << t << endl;

И если вы ищете безопасную альтернативу для printf -подобного форматирования, рассмотрите возможность использования библиотеки Boost Format .

3 голосов
/ 25 августа 2011

%d спецификатор формата для типа int. Итак, попробуйте -

cout << a[0] << "\t" << t << endl;
2 голосов
/ 25 августа 2011

Ключом к ответу является то, что вектор на самом деле не является вектором bools.Это действительно вектор прокси-объектов, которые можно перевести в int и bools.Это позволяет хранить каждый бул в виде одного бита для повышения эффективности использования пространства (за счет повышения скорости), но вызывает ряд проблем, подобных той, что была здесь показана.Это требование было одобрено в Стандарте C ++ в опрометчивый момент, и я полагаю, что большинство членов комитета теперь считают, что это ошибка, но это в Стандарте, и мы как бы застряли в нем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...