Ключевое слово & quot; auto & quot; вблизи критических точек

Возможный дубликат:
Сколько это слишком много с ключевым словом C ++ 0x auto

Я считаю, что использование «авто» вблизи критических точек может вызвать некоторые проблемы.

Это пример кода:

#include <iostream>
#include <typeinfo>
#include <limits>

using std::cout;
using std::endl;
using std::numeric_limits;
using std::cerr;

int main() {
auto i = 2147483647 /* numeric_limits<int>::max() */ ;
cout << "The type of i is " << typeid(i).name() << endl;

int count = 0;
for (auto i = 2147483647;
i < 2147483657 /* numeric_limits<int>::max() + 10 */ ; ++i) {
cout << "i = " << i << " " << endl;

if (count > 30) {
cerr << "Too many loops." << endl;
break;
}
++count;
}

return 0;
}

«Auto» решает, что тип «i» является целым числом, но верхний предел целого числа равен 2147483647, что легко переполняется.

Это выходы на Ideone (GCC-4.5.1) а также LWS (GCC-4.7.2). Они разные: «я» остается 2147483647 в петлях на Ideone (GCC-4.5.1) и переполняет на LWS (GCC-4.7.2). Но ни один из них не является ожидаемым результатом: 10 циклов, +1 каждый раз.

Следует ли мне избегать использования «авто» вблизи критических точек? Или как я здесь правильно использую «авто»?

ОБНОВЛЕНИЕ: кто-то говорит: «Используйте авто везде, где можете». в этом нить кому ты рассказываешь. Я не думаю, что это правильно. Тип «long long int» больше подходит для типа «int». Интересно, где я могу безопасно использовать «авто», а где нет.

ОБНОВЛЕНИЕ 2: Решение 4 (б) статья Херб Саттер должен был ответить на вопрос.

-4

Решение

Вы должны полагаться только на вывод типа для определения типа ваших переменных, если он будет правильным. Здесь компилятор делает вывод, что это int, который право что касается стандарта, то для вашей конкретной задачи требуется другой тип с большим диапазоном. Когда вы используете auto, вы говорите «компилятор знает лучше», но компилятор не всегда знает все.

Вы не будете использовать auto здесь, так же, как вы не использовали бы int, Вы можете сделать свой литерал иметь более высокий ранг L или же LL после этого — хотя они не гарантированно будут больше, чем ваши int) а потом auto вывел бы больший целочисленный тип.

Не говоря уже о том, что auto действительно ничего не экономит в этом случае. auto обычно используется, чтобы не печатать длинные, уродливые типы или типы, которые вы не знаете. В этом случае тип не длинный и некрасивый, и вы это знаете.

0

Другие решения

auto это просто синтаксический сахар. Это не тип, он просто выводит, какой тип должна быть справа, и решает тип этой переменной.

Если вы дадите ему литералы, он просто выведет тип по умолчанию, заданный компилятором.
Вам просто нужно знать, что это за тип.

0

Числовой литерал (без десятичной точки) всегда int если вы явно не измените его тип.

int x = 2147483657; // 2147483657 is treated as an int.
// If it does not fit tough it will be truncated
// according to standard rules.

long x = 2147483657L; // The L suffix tells the compiler to treat it as a long.
// Here you will get the correct value assuming long is larger than int.

В твоем случае:

for(auto i = 2147483647;i < 2147483657;) // is not going to work as i is always
// an int and literal overflows.

// Try correct types:

for(auto i = 2147483647L; i < 2147483657L;++i) //Now it should work correctly.
0

Вы ожидаете слишком многого от auto, Вы ожидаете, что auto автоматически выведет тип что лучше всего для манипуляции, что вы собираюсь выполнить на вашей переменной. Это семантический анализ и компиляторы не ожидается, что сделать это (чаще всего они не могут). Они не могут рассчитывать на то, как вы собираетесь использовать переменную, которую вы позже объявите в своей программе.

auto Ключевое слово только избавляет вас от необходимости явно писать слева тип выражения, появляющегося справа, избегая возможной избыточности и всех проблем, связанных с ней (что если тип выражения справа изменится?)

Тем не менее, все остальные ответы верны: если вы хотите, чтобы ваша переменная i чтобы не переполнить, вы должны назначить ему long long буквальный (используя LL постфикс).

0
По вопросам рекламы [email protected]