批处理'+ unexpected'错误



我正在尝试批量编写collatz猜想测试器(这是数学方面的东西)。该文件的目的是测试一个数字是否为偶数,以及它是否被2整除。如果这个数是奇数,它应该乘以3再加1。这应该循环往复。每次我试着运行这个文件时,它都允许我输入数字,然后它说"+在这个时候是意外的"。我的错误是什么?

@echo off
color f0
title Collatz Conjecture Tester
echo/
echo Enter the number you want to test.
echo/
echo/
set /p number=
:start
set /a test=%number% %% 2
if %test% EQU 0 ( 
    set /a number=%number% * 1/2
) else (
    set /a number=(%number% * 3) + 1
)
echo/
echo Result: %number%
timeout /t 1 >nul
goto start

当您在if语句,for循环或其他代码块中使用圆括号时,转义任何其他内部闭括号是很重要的,以便批处理解释器知道您还没有完成。

现在,批处理正在像这样读取if语句:

else (
    set /a number=(%number% * 3
)
+ 1

因此,它认为您提前终止了else,并由于某种原因在那里抛出了+ 1。要解决这个问题,可以使用^转义内部右括号。

if %test% EQU 0 ( 
    set /a number=%number% * 1/2
) else (
    set /a number=(%number% * 3^) + 1
)

SomethingDark已经找到了问题的根本原因,并在他们的回答中给出了适当的解决方案。

另一种避免括号和&|^<<>>等运算符麻烦的方法是将set /A的整个表达式括在一对引号内:

if %test% EQU 0 ( 
    set /A "number=%number% * 1/2"
) else (
    set /A "number=(%number% * 3) + 1"
)

如果你这样做,你不必再考虑适当的转义。

注意,在批处理文件中,%操作符总是需要像%%一样进行转义。
在启用延迟扩展的情况下,如果表达式位于""内,则需要像^!一样对!操作符进行转义,否则需要对^^!进行转义。

相关内容

最新更新