--------siwuxie095

 
 

 
 

 
 

三、用 set 实现计算

 
 

语法:

SET /A expression

 
 

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

 
 

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

 
 

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

&

二进制按位
"与"

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

^

二进制按位
"异"

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

|

二进制按位
"或"

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

= *= /=

%= += -=

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

&= ^= |=

<<= >>=

  

 
 

 
 

 
 

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)结果是 5:77

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

再换成十进制就是 5

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

数字不同,结果为 1

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

为 1,否则为 0

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

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

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

如:

@echo off

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

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

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

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 /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】

 
 

 
 

 
 

set 续1的更多相关文章

  1. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整(续)-使用配置文件动态注入

    上次实现了依赖注入,但是web项目必须要引用业务逻辑层和数据存储层的实现,项目解耦并不完全:另一方面,要同时注入业务逻辑层和数据访问层,注入的服务直接写在Startup中显得非常臃肿.理想的方式是,w ...

  2. [.NET] C# 知识回顾 - 委托 delegate (续)

    C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...

  3. iOS 开发者账号到期续费流程

    1.登录developer.apple.com,查看到期时间 2.到期提醒通知,点击Renew Membership续费(一般提前一个月提醒续费) 3.个人开发者账号续费需要支付 688人民币/年(9 ...

  4. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...

  5. CI-持续集成(1)-软件工业“流水线”概述

    CI-持续集成(1)-软件工业“流水线”概述 1   概述 持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次, ...

  6. 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续3篇-导出时动态生成多Sheet EXCEL)

    ExcelUtility 类库经过我(梦在旅途)近期不断的优化与新增功能,现已基本趋向稳定,功能上也基本可以满足绝大部份的EXCEL导出需求,该类库已在我们公司大型ERP系统全面使用,效果不错,今天应 ...

  7. [译]Godot系列教程三 - 场景实例化(续)

    场景实例化(续) 要点 场景实例化带来很多便利的用法,总体来说有: 将场景细分,更便于管理 相对于某些引擎中的Prefab组件更灵活,并且在许多方面更强大 是一种设计更复杂的游戏流程甚至UI的方式 这 ...

  8. 【小白的CFD之旅】13 敲门实例【续3】

    接上文[小白的CFD之旅]12 敲门实例[续2] 4 Results4.1 计算监测图形4.2 Graphics4.2.1 壁面温度分布4.2.2 创建截面4.2.3 显示截面物理量4.2.4 Pat ...

  9. 【小白的CFD之旅】12 敲门实例【续2】

    接上文[小白的CFD之旅]敲门实例[续] 主要内容 3 Solution3.1 Solution Methods3.2 Solution Controls3.3 Monitors3.4 Report ...

  10. jquery实现简单瀑布流布局(续):图片懒加载

    # jquery实现简单瀑布流布局(续):图片懒加载 这篇文章是jquery实现简单瀑布流布局思想的小小扩展.代码基于前作的代码继续完善. 图片懒加载就是符合某些条件时才触发图片的加载.最常见的具体表 ...

随机推荐

  1. Centos 中扩展 软件源 的安装 之 epel ( 为yum 扩展软件源 EPEL源 )

    EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL.CentOS和Scientif ...

  2. Promise的并行和串行

    Promise 并行 这个功能Promise自身已经提供,不是本文的重点.主要是依赖Promise.all和Promise.race. Promise.all是所有的Promise执行完毕后(reje ...

  3. endnote x7 破解版 关联word2010/2013

    方法/步骤   1 首先在已安装EndnoteX7的条件下,打开word2013在工具栏上方未见“EndnoteX7”标识,则需要将两者关联. 2 打开word左上角的“文件”,然后点开“选项” 3 ...

  4. bitmapdata的知识点

    flashplayer的cpu渲染 bitmapData占用的内存分两块,一块是原始数据区,另一块是解压后的内存区10秒内如果没有使用这个bitmapdata,解压后的内存区会被释放,当10秒后重新使 ...

  5. 【转】提高你开发效率的十五个Visual Studio 2010使用技巧

    原文网址:http://developer.51cto.com/art/201203/321942.htm 2012-03-06 14:38 Ron Ngai Ron Ngai的博客 字号:T | T ...

  6. oracle之 RAC本地数据文件迁移至ASM

    系统环境:CentOS release 6.7 (Final)Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit 操作过 ...

  7. php在循环内外实例化类占用内存比较

    关于php类的实例化和内存的关系,可以这么说:只要有一个new 关键字就是创建一个对象,创建一个对象就是在内存中分配了一个空间. 代码1: 在循环外实例化类:class ABC{ public $nu ...

  8. eclipse启动报错:An error has occurred.See the log file D:\eclipse\configuration\1552616709202.log

    如题,Eclipse崩了,只能按它留下的线索去看了1552616709202.log: !SESSION -- ::08.739 ----------------------------------- ...

  9. windows 如何查看端口占用进程ID 进程名称 强制结束进程

    1.查看指定端口的占用情况C:\>netstat -aon|findstr "9050" 协议    本地地址                     外部地址        ...

  10. windows2008 安装oracle10g“程序异常终止。发生内部错误。请将以下文件提供给oracle技术支持部门

    在安装oracle10g客户端程序的时候发生了错误!错误如下:“程序异常终止.发生内部错误.请将以下文件提供给oracle技术支持部门:“未知”“未知”“未知” 解决办法: 右键点setup.exe ...