• set 续1


    --------siwuxie095

       

       

       

    三、用 set 实现计算

       

    语法:

    SET /A expression

       

    /A 命令行开关指定等号右边的字符串为待计算的数字表达式。

       

    该表达式的各种计算符号的优先级如下:

       

    符号

    注释

    优先级

    备注

    ( )

    分组

    1

      

    ~ ! -

    一元运算符

    2

    • 是负号,表负数

    * / %

    算术运算符

    3

    % 是求余运算

    + -

    算术运算符

    4

      

    << >>

    二进制逻辑位移

    5

    输入表达式时,符号要添加双引号

    &

    二进制按位 "与"

    6

    输入表达式时,符号要添加双引号

    ^

    二进制按位 "异"

    7

    输入表达式时,符号要添加双引号

    |

    二进制按位 "或"

    8

    输入表达式时,符号要添加双引号

    = *= /=

    %= += -=

    算术赋值

    9

    输入表达式时,符号要添加双引号

    &= ^= |=

    <<= >>=

    二进制算术赋值

    10

    输入表达式时,符号要添加双引号

    ,

    表达式分隔符

    11

      

       

       

       

    set 的 /a 参数就是让 set 可以支持数学符号进行运算。所有需要进行计算的表达式,

    都必须添加 /a 开关

       

       

    注意:

    DOS 计算只能精确到整数,小数采用四舍五入

    DOS 计算的有效值范围是-2147483647 至 2147483647,超出无效

    DOS 计算精确到32位(二进制),最高位符号位(0 正 1 负)

       

       

       

       

    运算符号说明:

    ( ) 最优先运算

    ! 逻辑非,除 0 以外的任何数字,取 ! 都等于 0,而 !0 等于 1(在 DOS 里,

    字母和符号取非也都等于 1

    ~ 取反,但批处理的操作都是对数字先加 1 后再取反,如:~1 = -2

    - 负号,表示负数。如果两头都有数字,就是减号

    + - * / 数学最基本的加减乘除

    % 取余数,这个运算符非常特殊,当使用 set /p a=请输入一个表达式 :

    读取用户输入时,在命令行窗口可以使用 m%n 形式的表达式。

    如果是在批处理文本里,则要使用 set /a num=m%%n 这种形式,否则

    运算无法进行,使用转义字符 ^ 也不行

       

    如:

    @echo off

    set /p var=请输入一个表达式

    set /a result=%var%

    echo %result%

    pause

       

       

    运行一览:

       

    和:

    @echo off

    set /a result=10%%3

    echo %result%

    pause

       

    运行一览:

       

       

       

       

    以上符号在输入时,正常输入即可,不必加双引号

    以下符号,无论是手动输入到命令行窗口的形式,还是批处理文件里

    数学表达式的形式,都必须添加双引号,否则计算机无法识别和计算

       

       

    << >> 位运算符号,如: 7">>"1,(或用转义字符^7^>^>1

    结果是 3:十进制的 7 用二进制表示为 111,向右移动一位变成 11

    再换成十进制就是 3

    & 二进制按位与,两个数从个位对齐,上下两个数字都是 1,结果为 1,

    否则为 0。如:77"&"21,(或用转义字符 ^77^&21)结果是 577

    的二进制表示是 100110121的二进制表示是 10101,按位与后是 101

    再换成十进制就是 5

    ^ 二进制按位异,两个数从个位对齐,上下两个数字相同,结果为 0,两个

    数字不同,结果为 1

    | 二进制按位或,两个数从个位对齐,上下两个数字只要有一个为 1,结果就

    1,否则为 0

    = *= /= %= += -= 赋值符号(6个),先运算后赋值,简化表达式,常用于计数器

    &= ^= |= <<= >>= 二进制赋值符号(5个),先运算后赋值

    , 逗号运算符,分隔不同运算组

    如:

    @echo off

    set /a a=1+1,b=2+1,c=3+1

    echo %a% %b% %c%

    pause

       

       

       

       

       

       

    十六进制有 0x 前缀,八进制有 0 前缀,其余数字值都是十进制。如:0x12=18=022

    注意:八进制数字没有 08、09。凡是位计算,计算机都会换算成二进制运算后还原成

    十进制显示出来

       

       

       

    set /a var=num+1

    等号左边是被赋值变量,不可以使用变量符号 %var% !var!,等号右边的

    计算式中的 num,使不使用变量符号 %var%!var! 都可以

       

    延迟变量的情况下,等号右边的计算式中不使用变量符号 !var!,变量 var 的值

    依然是实时动态值。但如果使用变量符号 %var%,得到的就不是动态值了

       

       

    测试代码:

    @echo off

    setlocal enabledelayedexpansion

    set var=0

    for /l %%i in (1,1,10) do (

    set /a var=%%i*2+1

    set /a tem1=!var!+2

    set /a tem2=var+2

    set /a tem3=%var%+2

    echo tem1=!tem1! tem2=!tem2! tem3=!tem3!

    )

    pause

       

    sublime中:

       

       

    运行一览:

       

       

       

       

       

       

       

    建议:对于 set /a 的计算式,最好用双引号引起来,有些表达式会简单一些

    如:不用双引号时

    @echo off

    set /p N=请输入一个数字

    set /a num=1^<^<N

    echo %num%

    pause

       

    表达 1<<N 时,就要用到转义符号 ^,否则 < 管道符号的意思就是

    从某地方读入数据

       

    如果用双引号:

    @echo off

    set /p N=请输入一个数字

    set /a num="1<<N"

    echo %num%

    pause

       

       

       

    有一种情况,set /a 表达式如果含有括号,而 set /a 语句外又有

    括号包含着此 set 语句,那么此时的 set /a 表达式里的括号就必

    须用转义字符转义,或整个表达式用双引号

       

    (原因:批处理太死板,括号一般表达的是分隔效果,但在表达式里

    表达的是计算效果,如果不转义,批处理认为括号早早的就括回去,

    导致程序出错)

       

    如:

    @echo off

    setlocal enabledelayedexpansion

    for /l %%i in (1,1,10) do (

    set /a var=^(%%i+1^)*3

    echo var=!var!

    echo ^(%%i^)

    )

    pause

       

    sublime中:

       

       

    运行一览:

       

       

       

    使用一个转义字符亦可:

    @echo off

    setlocal enabledelayedexpansion

    for /l %%i in (1,1,10) do (

    set /a var=(%%i+1^)*3

    echo var=!var!

    echo (%%i^)

    )

    pause

       

    sublime中:

       

       

    运行一览:

       

       

       

    改为使用双引号:

    @echo off

    setlocal enabledelayedexpansion

    for /l %%i in (1,1,10) do (

    set /a var="(%%i+1)*3"

    echo var=!var!

    echo "(%%i)"

    )

    pause

       

    sublime中:

       

       

    运行一览:

       

       

       

    使用双引号后,echo "(%%i)" 会输出双引号,让人讨厌

       

    显然:echo 后面回显的内容有括号,而还有括号包含此 echo 时,

    回显的括号也要转义

       

       

       

    阶乘程序:

    @echo off

    set a=1

    set /p n=请输入一个数字

    if %n%==0 (

    rem 0!的感叹号表示阶乘

    echo 0!=1 & pause>nul & exit

    ) else (

    if %n% lss 0 (

    echo 负数不可以阶乘 & pause>nul & exit

    )

    )

    for /l %%i in (1,1,%n%) do set /a a*=%%i

    echo %n%!=%a%

    pause>nul

       

    sublime中:

       

       

    运行一览:

       

       

       

       

       

    求 2 的 n 此方:利用位运算 <<,每左移一次,增大一倍,这样效率最高

    @echo off

    set /p n=请输入 2 的几次方:

    set /a num=1^<^<N

    echo %num%

    pause

       

       

       

       

    set 命令显示诗句前面多个空格

    显示一首诗时,在每一句前面需要打出很多空格 ,使得整首诗占据

    窗口的中间。但一开始对每行空格输入的数量,不一定符合要求,

    需要进行增删修改。如果每一行都需要增删空格,操作就非常繁琐。

    用 set 就可以简单处理,而且删减空格也很方便。

    @echo off

    :: k 后面有看不见的空格

    set k=

    echo %k%水光潋滟晴方好

    echo %k%山色空蒙雨亦奇。

    echo %k%欲把西湖比西子

    echo %k%淡妆浓抹总相宜。

    pause>nul

       

    sublime中:

       

       

    运行一览:

       

       

       

       

    【made by siwuxie095】

       

       

       

  • 相关阅读:
    【C/C++】qsort函数的使用方法和细节
    MOOC C++笔记(五):继承
    MOOC 数据库系统笔记(二):数据库系统的基本结构及其演变发展
    PTA A1015
    MOOC 数据库系统笔记(一):初步认识数据库系统
    PTA A1014
    MOOC C++笔记(四):运算符重载
    PTA A1013
    PTA A1011&A1012
    1.1.22 同样的文档,行数不一样
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6361912.html
Copyright © 2020-2023  润新知