对于/a 参数/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:
() - 分组
! ~ - - 一元运算符
* / % - 算数运算符
+ - - 算数运算符
<< >> - 逻辑移位
& - 按位“与”
^ - 按位“异”
| - 按位“或”
= *= /= %= += -= - 赋值
&= ^= |= <<= >>=
, - 表达式分隔符
注意前提:
1. 8进制数0?(0<=?<=7)与16进制数0x?(0<=?<=15),首字符不为0者为10进制数.
2. /a参数只对-(2^31-1)至2^31之间整数进行操作(注意是xp版本).
这点可以用代码来测试:
@echo off&setlocal enabledelayedexpansion
:支持最大数为1.9950631168807583848837421626836e+3010
set m=1
for /l %%a in (1 1 10000) do (
for /l %%b in (1 1 %%a) do (
set /a m*=2
set /a n+=1
echo !m!=2^^^^!n!
if "!m:~,1!" == "-" echo !m!&set /a mm=!m!-1&echo !mm!=!m!-1 &pause&exit
) )
一元运算符~ ! -
~取反
将-(2^31-1)至2^31看做一个数轴,"原点O"为0的左侧与-1的右侧
(此数轴可以看做一个首尾封闭的数轴,对2^31-1加1将得到-2^31)
这样可以将计算机里的二进制数(全是整数)的取反看做求"相反数"了:
-2^31 ...︺︺︺︺︺︺︺︺︺︺︺︺︺︺︺O︺︺︺︺︺︺︺︺︺︺︺︺︺︺︺... 2^31-1
... -3 -2 -1 0 1 2 3 ...
~就表示的反数
比如:
set /a a=~-1
%a%就等于0
set /a a=~5
%a%就等于-6
!取非
!为0
!为1
比如:
set /a a=!2
%a%就等于0
set /a a=!0
%a%就等于1
"-"取负数
-与数学上的-x是一致的,只是要注意发生溢出时的状况
比如:
set /a a=-(-2147483648)
%a%为-2147483648而非2147483648,这是因为2147483648已溢出:
2147483648=(2^31-1)+1
算术运算符 * / % ﹢ -
算术运算符: * / % ﹢ - 分别对应
数学符号: x ÷ mod(取余) + -
需要注意的是"%"是在命令行下,而在bat中则要用%%
逻辑移位: << >>
注意在批处理中或命令行下要加上一对双引号""或用^对<,>进行转义.
set /a "<<"
表示对的二进制数左移位
比如:
set /a a=15"<<"1
%a%就等于30
这是因为:15=bin(00 00000 00000 00000 00000 00000 01111)
左移1位就成了bin(0 00000 00000 00000 00000 00000 011110)
而bin(0 00000 00000 00000 00000 00000 011110)=2^4+2^3+2^2+2^1=30
经过简单的数学推导就可以知道:
"<<"==*2^
">>"==/2^(注意溢出)
同理">>"就是右移,原理一样,这里略.
逻辑 "异", "或", "与": "^", "|", "&"
注意在批处理中或命令行下要在运算符前加上^
这里的: ^ | & 对应于
离散数学上的: 异或⊕ 析取∨ 合取∧
规则: 合取∧(有0则0) 析取∨ (有1则1) 异或⊕ (同0反1)
比如:
set /a a=15^^5
%a%就等于10
这是因为:
01111
⊕) 00101
─────
=) 01010
而bin(01010)=10
对于"|", "&"原理一样,这里略.
赋值运算符
"=" 这个不用说了
对于 *= /= %= += -= &= ^= |= <<= >>
拿"+="为例,其他同理.
这只是一种简写
比如下面两行代码等效:
set /a a+=2
set /a a=a+2
表达式分隔符","
这个运算符可以用来简化代码:
比如:
set /a a=1
set /a b=2
set /a c+=3
就可以简写为:
set /a a=1,b=2,c+=3
另外:
set /a ... 与 set /p ...
可以省略掉set 与 /之间的空格写成
set/a ... 与 set/p ...
关于这类省略空格的用法,还有不少,后续再补充.
set/a的另一个用法:
........
更详细的请点击我下面的
"学习"
|
|
Last edited by plp626 on 2008-4-19 at 02:31 PM ]