Есть ли способ написать большое количество в C++ исходном коде с пробелами, чтобы сделать его более читаемым?
Представьте, что у меня есть код:
vector<int> temp = vector<int>(1 000 000 000);
Вышеупомянутое не будет компилироваться, поскольку компилятор будет жаловаться на пробелы. Можно ли указать C++ опустить эти пространства при компиляции или иным образом упростить чтение номера?
Ответы
Ответ 1
Попробуйте разделитель цифр:
int i = 1'000'000'000;
Эта функция введена с C++ 14. Он использует одиночную кавычку ('
) в качестве разделителя цифр.
Также см:
Ответ 2
Когда я делал подобные вещи на платформах без С++ 14 (как правило, для микропроцессоров), я представлял большие числа, разделив его на умножение:
int i = (1000 * 1000 * 1000);
Добавить UL
или L
postfixes по вкусу
Преимущество здесь в том, что оно совместимо в основном с любой платформой, поддерживающей C89 (и, возможно, раньше).
Вообще, вероятно, безопасно предположить, что операторы умножения выпадут во время компиляции, но если вы используете константы, подобные этому в цикле, возможно, стоит дважды проверить.
Ответ 3
Я обычно #define константы для этой цели, поскольку он экономит отсчеты нулей и дает понять, что вы имеете в виду для всех, кто просматривает код. Например
#define THOUSAND 1000
#define MILLION 1000000
vector<int> temp = vector<int>(THOUSAND * MILLION);
Это дает понять, что я действительно имею в виду тысячу миллионов человек и не допускал ошибок в нулях
Очевидно, вы можете использовать перечисления, если хотите.
Ответ 4
Если вы не используете С++ 14, другой вариант будет использовать какой-то класс, унаследованный от строк, с неявным int-cast и, возможно, регулярным выражением в конструкторе, чтобы ограничить числа. Я использую CString для легкого примера.
class NumString : public CString
{
public:
NumString(CString number) : num(number) { } //maybe insert some regex-check here
operator long() const
{
CString tmp = num;
tmp.Remove(' ');
return atol(tmp);
}
private:
CString num;
};
NumString a = "1 000 000 000";
int b = a;
bool test = b == 1000000000;
//test will be true
Ответ 5
Другая идея может быть:
#define _000 *1000
int k = 1 _000 _000;
Ответ 6
Поскольку это напоминает мне цифру, группирующую мой первый неуклюжий подход без С++ 14
было бы
#define INTGROUPED1(a) (a%1000)
#define INTGROUPED2(a,b) (a%1000*1000 + b%1000)
#define INTGROUPED3(a,b,c) (a%1000*1000000 + b%1000*1000 + c%1000)
int v1 = INTGROUPED1( 123);
int v2 = INTGROUPED2( 123,123);
int v3 = INTGROUPED3( 23,123,123);
но я бы использовал такие трюки скорее в частном контексте.
Просто подумайте,
INTGROUPED3(1234,1234,1234); //This would be (234,234,234) without a compiler complaining
EDIT1:
Возможно, лучший aproach будет использовать оператор ## препроцессора
#define NUM_GROUPED_4ARGS(a,b,c,d) (##a##b##c##d)
int num = NUM_GROUPED_4ARGS(-2,123,456,789); //int num = (-2123456789);
Это больше похоже на WYSIWYG, но не застраховано от неправильного использования. E. g. вы можете компилятору жаловаться на
int num = NUM_GROUPED_4ARGS(-2,/123,456,789); //int num = (-2/123456789);
но это не будет.