Windows批处理如果 - 否则无效

mar*_*rko 0 windows cmd if-statement batch-file

[接收整数作为输入的简单程序,如果该数字是微不足道则打印]

当我运行这个我得到一个错误"(此时出乎意料)

@echo off
set /a i=2
set /p input="enter an integer: "
set /a n=input
set /a t=n/2

:loop1      
    if %t% LSS %i% (
        goto trivial
    ) else (
        set /a t0=n%i
        if %t0%==0 (
            goto notTrivial
        ) else (
            set /a i=i+1
            goto loop1
        )
    )
:trivial
    echo %n% is trivial
    goto endd
:notTrivial
    echo %n% is not trivial
:endd
pause > nul
Run Code Online (Sandbox Code Playgroud)

但是当我在loop1中删除else语句时(这是不必要的(因为if if中的goto命令))它可以工作

:loop1      
    if %t% LSS %i% (
        goto trivial
    ) 
        set /a t0=n%i
        if %t0%==0 (
            goto notTrivial
        ) else (
            set /a i=i+1
            goto loop1
        )
Run Code Online (Sandbox Code Playgroud)

(这怎么可能?

MC *_* ND 5

删除else子句时,其中的代码现在不在任何块中.

为什么这有关系?因为在批处理文件中,首先解析然后执行行或行块(括号内的代码).解析变量读取操作时,在开始执行命令之前,在解析时将替换为变量内部的值(此处更多).

所以,在这段代码中

   ) else (
        set /a t0=n%i
        if %t0%==0 (
            goto notTrivial
        ) else (
            set /a i=i+1
            goto loop1
        )
    )
Run Code Online (Sandbox Code Playgroud)

您更改了变量的值t0,但无法在同一块中检索此更改的值.但是,如果删除该else子句,则代码不在块内,并且一切都按预期工作(语法错误除外,请尝试使用set /a "t0=n %% i").