2015-08-30 2 views
2

Это самая странная ошибка, с которой я когда-либо сталкивался. Несмотря на то, что я видел: ошибкаОшибка сбоя номера ошибки?

Invalid number. Numeric constants are either decimal (17), 
hexadecimal (0x11), or octal (021). 

миллион раз, я не могу понять, что случилось с этим кодом:

if "%ss%" == "00" (
    set /a 3n%1+=%3 
    set /a 3n%1+=%4 
) 

Это дает:

C:\Users\...>if "00" == "00" (
set /a 3n2+=1 
set /a 3n2+=3 
) 
Invalid number. Numeric constants are either decimal (17), 
hexadecimal (0x11), or octal (021). 

Я могу» Подумайте, почему это происходит.

Примечание: Даже если выражение ложно, ошибка все еще срабатывает.

+0

Я не думаю, что код, который вы опубликовали, может генерировать эту ошибку, если условие IF является ложным. Это сообщение об ошибке генерируется только в том случае, если выполняется команда SET/A, чего не может быть, если выражение ложно. Оператор всегда анализируется, но он выполняется только в том случае, если условие истинно. – dbenham

ответ

3

Ошибка возникает из-за того, что ваше имя переменной 3n2 начинается с числа.

Хотя имя переменной является технически обоснованным, starting it with a number is a really bad idea and you should never do it.

Чтобы избежать ошибки, измените первый символ имени переменной на букву или знак подчеркивания.

if "%ss%" == "00" (
set /a _3n%1+=%3 
set /a _3n%1+=%4 
) 
2

Я согласен с SomethingDark-х answer: начальная цифра вызывает «неправильный» поведение и он может (обязательно!) Решается изменить название переменной.

Общий пакетный парсер идентифицирует команду set, вызывает внутреннюю функцию asociated, которая видит переключатель /A и делегирует всю работу другому анализатору, который обрабатывает арифметический синтаксис.

Источником поведения является синтаксис, разрешенный арифметическим парсером set /a. Хотя это кажется очевидным, что set /a 3n2+=1 добавляет один к переменной, set /? помощь государства,

  • Синтаксис арифметических набор операций set /a expression
  • = оператор

То есть, в то время как set /a может и обычно используется, чтобы установить значение переменной, он позволяет вещи как set /a 1+1, без какой-либо переменной. Переменные - это только один операнд, используемый оператором присваивания.

Когда арифметический синтаксический анализатор начинает свою работу, одна из первых операций (после удаления цитаты, обрезка исходного пространства ...) заключается в проверке, является ли следующий символ для обработки в строке ввода цифрой, и если это , парсер предполагает, что числовой операнд найден, и для работы требуется преобразование из текста команды ввода в число, и здесь возникает ошибка, так как 3n2 не может быть преобразован в число.

Конечно, если текст может быть преобразован в число и без ошибок преобразования не вызывает,

set /a 123=1 

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

похож (более очевидный) случай

set /a =123+1 

где мы получим недостающую ошибку операнда: знак равенства является бинарным оператором, а левый операнд не может быть найден.

Смежные вопросы