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

[数值计算] 同一个set语句的三种写法

set /a str+=1
set /a str=str+1
set /a str=%str%+1


以上三条代码,我都在bat中测试过了,结果是一样的。

疑问:

1.在何种情况下,才可以用第一种方式?
2.在命令语法中,等号右边的变量是一定要加%符号的,为什么第二种方式也可以?
大家有什么说法吗?

[ 本帖最后由 SmallK 于 2008-9-22 02:49 编辑 ]
虚心使人进步 细节成就完美

多看下命令的帮助信息。
这三句相等,如果你不嫌麻烦、代码繁杂,可以用第2、3种

  1. /A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
  2. 评估器很简单并以递减的优先权顺序支持下列操作:
  3.     ()                  - 分组
  4.     ! ~ -               - 一元运算符
  5.     * / %               - 算数运算符
  6.     + -                 - 算数运算符
  7.     << >>               - 逻辑移位
  8.                        - 按位“与”
  9.     ^                   - 按位“异”
  10.     |                   - 按位“或”
  11.     = *= /= %= += -=    - 赋值
  12.       &= ^= |= <<= >>=
  13.     ,                   - 表达式分隔符
  14. 如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
  15. 引号扩起来。在表达式中的任何非数字字符串键作为环境变量
  16. 名称,这些环境变量名称的值已在使用前转换成数字。如果指定
  17. 了一个环境变量名称,但未在当前环境中定义,那么值将被定为
  18. 零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
  19. 来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,
  20. 那么它显示该表达式的最后值。该分配的操作符在分配的操作符
  21. 左边需要一个环境变量名称。除十六进制有 0x 前缀, 八进制
  22. 有 0 前缀的,数字值为十进位数字。因此, 0x12 与 18 和 022
  23. 相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
  24. 因为 8 和 9 不是有效的八进制位数。
复制代码

[ 本帖最后由 pusofalse 于 2008-8-23 12:17 编辑 ]
心绪平和,眼藏静谧。

TOP

set /a str+=1
set /a str=str+1
这2个的意思应该是一样的可以在任何情况下用.
set /a str=%str%+1这个应该是在此前str要有赋值,后面用str就要用%str%.

不晓得我理解的对不对``
忆往昔笑豺狼哭叱咤天地风云际望今朝笑贫不笑娼人民不敌人民币

TOP

  set /a str+=1 是 set /a str=str+1 的缩写形式,而 set /a str=str+1 在很大程度上又是 set /a str=%str%+1 的简写形式。之所以说是很大程度上而不直接说前者就是后者的简写,是因为 set /a str=%str%+1 只有在不需要使用变量延迟的时候才等同于 set /a str=str+1 。简而言之,在不需要使用变量延迟的情况下, set /a str=%str%+1、set /a str=str+1 和 set /a str+=1 是等效的。只有在使用 set /a 做数值计算的时候,%str% 才可以省略百分号对。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

了解了。谢谢三位!!

[ 本帖最后由 SmallK 于 2008-9-22 02:53 编辑 ]
虚心使人进步 细节成就完美

TOP

set /a str+=1
set /a str=str+1
以上两者是相同的,其中变量str在在set /a命令内部处理的
set /a str=%str%+1
而这个中的%str%的变量扩展是在命令解释器下完成的

例如tmp=9
那么set /a tmp+=1,x=10*tmp中x的结果为100
而set /a tmp=%tmp%+1,x=10*%tmp%中x的结果为90
1

评分人数

    • more: 好东西!!!PB + 20 技术 + 1 + 1

TOP

由于疏忽引起的关于变量延迟的话题
http://bbs.verybat.org/viewthread.php?tid=8596
注意后面的回帖更有价值
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

set 的整数计算是在独立的进程下完成的,变量寄存是实时刷新的,不存在延时的要求
例子如这样
set a=10
set b=a
set /a %b%*10
它的结果等于100

TOP

返回列表