实际上有两个错误。好吧 - 三,也许。
当然在 theELSE
和 the之间缺少空格(
然后是奇怪的拼写arithmetic
- 这很关键。DOS 无法处理糟糕的拼写。
好吧,实际上我只是在固定空间后尝试了批处理。它崩溃了。它真的做到了!一次,it crashed
是准确的。好吧 - CMD实际上并没有崩溃,它只是返回到提示符。没有错误信息 - 没有。刚刚再次弹出提示。
所以我set /p
通过删除=
. 这似乎解决了问题,因为下次提示愉快地出现,然后一切顺利。
所以我决定解决jeb
问题。当然 - 输入一个类似的表达式(3*3)+42
,然后输入一个不正确的结果,你会得到一个丑陋的反对意见。
最后一个行为的原因是语句被解析(解码和验证)任何 %var% 都被它在解析时的值替换。然后执行语句。
因此,如果我输入(3*3)+42
and 56
,原始表达式将被解析为
IF 56 == 51 (ECHO Your...right!) ELSE (ECHO Your...wrong!&ECHO (3*3)+42 = 51)
[在批处理中,您可以通过用 分隔命令来级联命令&
]
现在验证失败,因为在解析器看来,ELSE
表达式以右括号结尾3*3
@ECHO OFF
setlocal
SET /p exp="Enter Arithmetic Expression:"
SET /p ans1="Enter Expression's Product:"
REM calculating the arithmetic expression:
SET /a ans2= %exp%
::
:: Way the first
::
FOR /f "delims=" %%i IN ("%exp%") DO (
IF %ans1% == %ans2% (
ECHO Your answer is right!
) ELSE (
ECHO Your answer is wrong!
ECHO %%i = %ans2%
)
)
::
:: Way the second
::
FOR /f "tokens=1*delims==" %%i IN ('set exp') DO (
IF %ans1% == %ans2% (
ECHO Your answer is right!
) ELSE (
ECHO Your answer is wrong!
ECHO %%j = %ans2%
)
)
::
:: Way the third
::
SET refexp=%exp:)=^^)%
IF %ans1% == %ans2% (
ECHO Your answer is right!
) ELSE (
ECHO Your answer is wrong!
ECHO %refexp% = %ans2%
)
ECHO Note: 'SET exp' returns
SET exp
第一个和第二个解决方案使用FOR /F
命令的分析能力(从提示中看到FOR /?
。)这里的关键是如果表达式可以被哄到metavariable
(循环控制变量)中,那么它直到运行时才能被评估,到那时解析器已经验证了表达式。
第三种解决方案是在"escape"
任何右括号前加上插入符号 ( ^
) - 请参阅SET /?
文档。当一个字符被转义时,它在批处理语言中的特殊含义被忽略,它变得就像任何其他字符一样。在这种情况下,由于插入符号本身就是具有特殊含义的特殊字符,因此它本身需要通过插入符号进行转义...
但奇怪的是,当我用=
重新插入后的空格重新运行程序时,它运行得很愉快。奇怪的...