Терминал L в C - PullRequest
       22

Терминал L в C

0 голосов
/ 26 февраля 2011

В С следующие эквиваленты:

long int x = 3L; (обратите внимание на L)

и

long int x = 3

Они кажутся одинаковыми. Если они есть, какой из них следует использовать? Должен ли L быть указан явно?

Если они разные, в чем разница?

Ответы [ 2 ]

8 голосов
/ 26 февраля 2011

3.14L является литералом long double, в то время как 3.14 является литералом double.Это не будет иметь большого значения в этом случае, так как оба используются для инициализации long int.Результат будет 3.

РЕДАКТИРОВАТЬ: ОК, 3L это литерал long, а 3 это литерал int.Это все равно не будет иметь большого значения, так как int будет «повышен» до длинного.Результат будет одинаковым в обоих случаях.

РЕДАКТИРОВАТЬ 2: Одно место, где это может иметь значение, выглядит примерно так:

printf("%ld\n", 123);

Это неопределенное поведение, так как строка формата указываетlong и только int передается.Это было бы правильно:

printf("%ld\n", 123L);
1 голос
/ 26 февраля 2011

Десятичная целочисленная константа без суффикса имеет - в зависимости от своего значения - тип int, long, long long или, возможно, определенный расширенный целочисленный тип со знаком со значением, превышающим long long.

Добавление суффикса L означает, что тип будет по крайней мере long, суффикс LL означает, что тип будет по крайней мере long long.

Если вы используете константу для инициализации переменной, добавление суффикса не имеет значения, так как в любом случае значение будет преобразовано в тип цели. Тем не менее, тип константы может быть уместен в более сложных выражениях, поскольку он влияет на семантику операторов, продвижение аргументов и, возможно, на другие вещи, о которых я сейчас не думал. Например, предполагая 16-битный тип int,

long foo = 42 << 20;

вызывает неопределенное поведение, тогда как

long bar = 42L << 20;

четко определен.

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