В Ada можно записать числа с символами подчеркивания для разделения цифр, что значительно улучшает читаемость. Например: 1_000_000 (что эквивалентно 1000000) Есть ли аналогичный способ для С++?
EDIT: это вопрос об исходном коде, а не в/в.
В Ada можно записать числа с символами подчеркивания для разделения цифр, что значительно улучшает читаемость. Например: 1_000_000 (что эквивалентно 1000000) Есть ли аналогичный способ для С++?
EDIT: это вопрос об исходном коде, а не в/в.
С++ не поддерживает (в настоящее время) эту поддержку. Однако здесь есть два способа:
Использование пользовательских литералов в С++ 11; это позволит вам написать код следующим образом:
int x = "1_000_002"_i;
(Написание этого как constexpr
было бы более сложным, но, безусловно, возможно.)
Используя простой макрос, это позволит использовать следующий код:
int x = NUM(1,000,002);
В настоящее время нет возможности сделать это. Однако есть предложение ввести разделители цифр (N3499). Они еще не выбрали тот символ, который они хотели бы использовать в качестве разделителя. Текущие предложения:
4 815 162 342
4`815`162`342
4'815'162'342
4_815_162_342
К сожалению, все они имеют проблемы, описанные в предложении.
Вы можете использовать хакерский подход, используя пользовательский литерал:
long long operator "" _s(const char* cstr, size_t)
{
std::string str(cstr);
str.erase(std::remove(str.begin(), str.end(), ','), str.end());
return std::stoll(str);
}
int main()
{
std::cout << "4,815,162,342"_s << std::endl;
}
Это напечатает:
4815162342
Он просто удаляет все запятые из данного литерала и преобразует его в целое число.
int main()
{
int x = 1e6;
}
вы всегда можете просто определить переменный макрос, используемый как N(123,456,678)
. это немного больше проблем, чем это стоит. в частности, вам может потребоваться обход некоторых визуальных особенностей С++ для переносного кода для подсчета аргументов.
То, что вы ищете, вполне возможно благодаря imbue()
потоку ввода-вывода с соответствующим аспектом языка (в этом случае num_put).
(Предполагается, что вы говорите об I/O.Если вы говорите о самом источнике, это невозможно, как на С++ 11.)