Почему анализатор C не допускает пробелов между цифрами целочисленного литерала?

Я ожидаю, что это нарушит другой синтаксический анализ, но это не сразу приходит в голову...

например. Если я скажу это:

#include <stdio.h>
int main()
{
    int i = 10 000;
    printf("%d\n", i);
    return 0;
}

Мой компилятор говорит следующее:

ctest.c:5: error: expected ‘,’ or ‘;’ before numeric constant

Я думаю, что это будет особенность, т.е. легче "синтаксический анализ" больших целых чисел с разделителями тысяч. Я использую недавний GCC и предполагаю, что это касается других компиляторов/парсеров/лексеров; в зависимости от того, что это объекты.

Ответ 1

Язык не позволяет этого (целочисленный литерал - это один токен, промежуточный пробел разбивает его на два токена), но, как правило, почти ничего не происходит, если выразить инициализатор как выражение, которое является вычислением литералов:

int i = 10 * 1000; /* ten thousand */

Ответ 2

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

(Да, я знаю, что это не серьезное предложение).

EDIT: Это была просто глупая вещь выше, мой настоящий комментарий - это часть ниже

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

Я не верю, что есть какая-то техническая причина, из-за которой это невозможно сделать, тем более, что люди видят номер как единый неделимый токен, поэтому он должен быть написан так. Я должен сказать, что я точно не знаю, почему, но это раздражало бы меня, чтобы числа, разбитые так, как в коде. Я не могу сказать, что для этого есть веская причина, но она по-прежнему верна:) Возможно, это то, к чему я привык.