#gcc
#gcc
Вопрос:
У меня есть некоторый автоматически сгенерированный код. Код предназначен для MCU, поэтому у него есть некоторые временные ограничения, которые не допускают циклов, что означает, что я генерирую некоторый код, подобный этому:
pa_result[06] = pa_positive[06] - pa_negative[06];
pa_result[07] = pa_positive[07] - pa_negative[07];
pa_result[08] = pa_positive[08] - pa_negative[08]; //<--terrible things
pa_result[09] = pa_positive[09] - pa_negative[09]; //<--terrible things
pa_result[10] = pa_positive[10] - pa_negative[10];
pa_result[11] = pa_positive[11] - pa_negative[11];
Компилятор видит 08
и 09
и принимает восьмеричное число. Однако он не делает таких предположений для любого другого числа.
Есть ли префикс для указания «не восьмеричный»? (кроме того, почему только с 08
и 09
)
Комментарии:
1. Учитывая, что стандартным поведением является принятие восьмеричного числа в числах с префиксом 0, я не могу представить, чтобы компилятор изменил это на что-то несоответствующее. С учетом сказанного, я бы ожидал, что компилятор, по крайней мере, предупредит об этом.
2. @E_net4 он предупреждает только о двух из них. Я заметил это только сегодня, потому что я перешел от 0-7 записей к 0-16. gcc не предупреждает до
08
. Итак, я думаю, что я просто введу пробел вместо 0. Я использовал i в коде, который его сгенерировал.
Ответ №1:
Ноль 0
в качестве начального символа в числе — это стандартный способ C определить, что за ним следует восьмеричное число. Единственная причина, по которой 08
и 09
выдает ошибку, заключается в том, что это недопустимые восьмеричные числа. 01
— 07
все ли допустимые восьмеричные числа представляют те же десятичные числа 1-7, которые вы ожидаете. Это по той же причине, по которой шестнадцатеричные числа 0x0
— 0x9
выглядят так же, как десятичные числа от 0 до 9, при условии, что вы игнорируете, 0x
что указывает на то, что за ними следуют шестнадцатеричные цифры.
Однако 8
и 9
не являются допустимыми восьмеричными цифрами, точно так же, как A
не являются допустимой десятичной цифрой, хотя в шестнадцатеричном формате это совершенно нормально, представляя десятичное число 10.
Вам нужно будет удалить начальный ноль 0
, чтобы они считались десятичными числами и работали должным образом.