[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

回复 7楼 的帖子

^! 是用 ^ 转义作用, 将 ! 转为逻辑非运算符号, 在用 setlocal enabledelayedexpansion 打开了延迟的变量扩展时, 成对的 ! 会被处理为变量扩展之义, 所以逻辑非符号 ! 需转义
位异或 ^ 也需转义, 可运行如下代码查看不用转义有何不同
  1. set /a r=3^7,r1=3^^7
  2. set r
  3. pause
复制代码

T=^!(M-2)  是判断是否2月, 是2月,T得1,否则得0; 其它类推.
^!^!(Y%%100) 判断 Y 是否不被100整除, 不被整除得1, 否则得0, 这里虽是两次逻辑非运算, 但并不能抵消为不用逻辑非运算.
CMD 下 逻辑非的规则为: 若0得1, 非0得0
当 Y不被100整除且 对100的余数不为1时, 不用两次取非就得不到1的结果

[ 本帖最后由 neorobin 于 2010-5-6 09:59 编辑 ]

TOP

Q: ^和^^分别的什么意思?为什么结果是37是4

A:
3^7 只是对7进行了转义, 7 还是 7, 故结果成了 37
3^^7 则是对 ^ 进行了转义, 可以理解为单个的 ^ 是一个转义前缀字符, 当它后面是其它字符时, 会发生可能的转义作用, 比如将一个有语法意义的字符转义为一个普通字符.
而两个 ^ 在一起时, 就是对转义前缀字符自身进行了转义, 使它没有了转义前缀的这个作用, 但由于在 set /a 后的表达式中, 所以它仍有另一个语法作用, 即 位异或.
3 的 二进制表达为 11, 而 7 的二进制表达为 111, 位异或的规则为: 同则0, 异则1 -- 两操作数对应位相同, 结果的对应位取0; 两操作数对应位相异, 结果的对应位取1.
  1. 011
  2. 111  (这里只取了最低的三位作 位异或 运算, 事实上, 其它未列出的高位上都是 0, 使得结果的对应高位上也一样取了 0)
  3. --------
  4. 100
复制代码
二进制 100 的表达即 十进制数 4.

Q: ^!^!(Y%%100) 为什么要进行两次逻辑非运算?

A:
此问题在 8 楼已作说明, 可能只是不够详细, 强调指出, 这个部分表达式的结果必须为 0 或者 1, 否则会使后面的计算发生错误.
举例来说: Y为2002时, Y%%100 得2, 第一次取非得 0, 再对 0 取非, 得 1. 这样把不是 1 的结果变成了 1.
Y为2000时,  Y%%100 得0, 第一次取非得 1, 再对 1 取非, 得 0. 即两次取非 与不取非的结果是一样的. 但前提是 Y可以被100整除, 即余数是0.

用 0 来表示一个逻辑假值, 数值上是唯一的.
用不等于 0 的值 来表示一个逻辑真值, 但数值上却不是唯一的了, 因为不等于 0 的数有无数个. 但只用 1 来表示一个逻辑真值, 这样数值上也就是唯一的了.

Q: Y%%100中要为什么要使用两个%?

A:
首先引用 ntcmds.chm 中文版原文
Cmd.exe 提供批处理参数扩展变量(%0 到 %9)。当在批处理文件中使用批处理参数时,%0 将由批处理文件名替换,而 %1 到 %9 将由在命令行键入的相应参数替换。要访问大于 %9 的参数,必须使用 shift 命令。
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]

参数
...
arguments
对于以 :label 打头的批处理程序,指定要传送给其新实例的命令行信息,包括命令行选项、文件名、批处理参数(从 %1 到 %9)或者变量(比如 %baud%)。

如果不使用 双写的 % , 首先求余运算必然与 批处理参数发生混淆, 其次还可能与 变量扩展发生混淆, 所以双写转义就是来避免发生语法歧义混淆的一种手段.



Q: R=(^!(Y%%4)&^!^!(Y%%100))中的为什么要加上一个&符?

A:
此处的 & 是 按位与 运算符, 并不是严格意义的逻辑与运算符, 但一些情况下可与逻辑与等效.

闰年的判断规则为: Y表示年份数字, ((Y能被4整除)且(Y不被100整除))或(Y能被400整除)
这里我用了严格的 逻辑联接词(且 或)  和 括号 来表达这个规则
代码中 求余运算后 都用了 一次或两次逻辑非 运算, 可以保证结果都转化为 0 或者 1, 这样逻辑真值和假值在数值上都是唯一的了, 就可以保证 其后的 按位与 运算 的结果 与 逻辑与运算 的结果是等效的. (数值上不唯一的两个真值会导致按位与运算的结果为假值 0, 例如 set /a "2&4" 的结果便得 0)

(^!(Y%%4)&^!^!(Y%%100)) 的意义即闰年规则中的部分语句:   ((Y能被4整除)且(Y不被100整除)),  其中 逻辑非 ^! 的优先级高于 按位与

[ 本帖最后由 neorobin 于 2010-5-7 18:08 编辑 ]
1

评分人数

TOP

回复 12楼 的帖子

原帖由 zc584267913 于 2010-5-10 11:30 发表
请问下
^所转义的范围是什么?是只能对数字及字符进行转义吗?比如r=3^7=37,r=-3^-1=-31,但为什么r=3^-1=2呢?是否在set/a后逻辑运算符和位运算符都无法转义吗?

^!(Y%%4)&^!^!(Y%%100))|^!(Y%%400)"
(Y能被4 ...


set /a r=-3^-1 的结果是 -4 而不是 -31, - 被转义后意义仍为原来的语法意义 负号 或 减法

引用 ntcmds.chm 中文版
地址: ms-its:C:\WINDOWS\Help\ntcmds.chm::/ntcmds_shelloverview.htm
可以将大多数字符用作变量值,其中包括空格。如果使用特殊字符 <、>、|、& 或 ^,则必须在它们前面加上转义字符 (^) 或引号。如果使用引号,则必须将引号作为值的组成部分,因为等号后面的任何内容都会被视为值。


Q: ^所转义的范围是什么?
对于转义范围的问题, 我也未有更深入的认识.
请在论坛搜索相关内容及观察 运行结果 随 代码中运用转义情形 而发生的变化

^!(Y%%4) 是指 Y 是否能被 4 整除, 注意含有一次逻辑非运算

中间的 Y%%100, 加上 两次 逻辑非运算 后就(也才)是指 Y 是否不能被 100 整除, 如果只加上 一次 逻辑非运算, 便是 Y 是否能被 100 整除

TOP

返回列表