Другие языки программирования и технологии

C++, какой смысл приписывать к числам букву L? (long N(0L), N % 2L) Чем грозит неприписывание? Особенн в Visual studio.

Код в учебнике:

long N(0L);
cin >> N;
if(N % 2L)
cout << "Odd";
else
cout << "Even";

Насколько я понимаю именно в этом коде смысла в L нет, а написано в назидание, что дескать "привыкайте", а то будет плохо.

Не может ли кто привести пример кода где число с неприписанной к нему L вызывает ошибку? Особенно в визуал студии, где лонг и инт равны.
ВВ
Вова Визер
21 729
Они равны не в Visual Studio, а на 32-разрядной операционной системе Windows. Но так бывает не всегда.
Максим Малащук
Максим Малащук
64 699
Лучший ответ
Конкретно в этом примере ошибка не возникнет, как не крути. Но вообще считается хорошим тоном писать код так, чтобы не было неявных преобразований типов.
На 16-битных машинах с дополнительным кодом, например, 32767 + 1 != 32767L + 1 (число слева вообще отрицательное).
Раз хотите пример, где это приниципиально, то вот скриншот:

На практике так:
Win32, Win64: sizeof(long) = sizeof(int) = 4
UNIX-like: sizeof(int) = 4, sizeof(long) = разрядность программы
Разрядность программы по определению равна размеру "обычного" указателя.

Значит, у меня 64-битная UNIX-like система.
А книжка могла быть написана еще во времена 16-битной винды, кстати. В любом случае, неявное преобразование типов - зло, но часто этому правилу не следуют, потому что правила хорошего тона в некоторых случаях выполнять накладно.

ЗЫ: нужно новые правила хорошего тона писать, тип long в мультиплатформенном коде - зло: -) У него самая хаотическая разрядность. Обычные int и long long int в этом плане лучше, если уж typedef-ить свой тип лениво.
Андрей Блинков
Андрей Блинков
19 662
Андрей Блинков А вот еще один пример, уже для Винды подойдет:

https://ideone.com/DtWHsQ
Хорошим тоном считается в явном виде показывать свои намерения в коде. По этой же причине не люблю функции с параметрами по умолчанию. Для инициализации например double переменных тоже всегда пишу в явном виде:
double a = 1; //ошибки не будет
double b = 1.0; //здесь сразу видно, что работаем с вещественным типом.
А если переменная инициализируется гораздо позже своего объявления, то когда читаешь чужой код нужно будет дополнительное время, чтобы разобраться с её типом.

c = 0; // Эта переменная какого типа? Целого?
d = 0.0; // тут однозначно вещественная переменная, это видно сразу.
Кроме того, если нужно в каком-нибудь выражении использовать константу, то тип константы зависит только от её значения.
Вова Визер За точку десятичную я согласен, очень легко сделать ошибку не поставив ее .

Но ведь хоть с L, хоть без L, понятно, что это литерал целого типа.
А пока целое число не превышает максимального для типа инт, то и ошибки не будет. А при одноразрядных числах оно ведь никак не превысит.

Вы сами всегда пишете L в таких случаях?