我正在尝试批量编写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"
)
如果你这样做,你不必再考虑适当的转义。
注意,在批处理文件中,%
操作符总是需要像%%
一样进行转义。
在启用延迟扩展的情况下,如果表达式位于""
内,则需要像^!
一样对!
操作符进行转义,否则需要对^^!
进行转义。