回复 10# qixiaobin0715
set n=2a 是直接字符串形式存储的,set /a n=n 是先解析再变量名取值最后计算的,
set /a n=2a 在解析阶段就不通过,而set /a n=n 在取值阶段没有合法性的判断。
参考取值阶段的部分源码:- LONG
- PopOperand( VOID )
- {
- TCHAR *wptr;
- LONG result;
-
- if (iOperand == 0)
- return 0;
-
- result = lOperands[ --iOperand ].Value;
- if (wptr = MyGetEnvVarPtr(lOperands[ iOperand ].Name)) {
-
- while (*wptr)
- if (*wptr <= SPACE || *wptr == QUOTE)
- wptr += 1;
- else
- break;
-
- result = _tcstol(wptr, &wptr, 0);
- }
-
- return result;
- }
复制代码 result = _tcstol(wptr, &wptr, 0);wptr是字符串"2a",通过_tcstol将字符串"2a"转化为长整型数字2作为返回,然后wptr是剩余的"a"。
它会进行最大限度的匹配和转化,比如"086"判断为八进制转化为0,剩余86。
set /a n=086 则会提示无效数字错误是因为解析阶段还有一个有效性的判断:- if (_istdigit(*tas) || _istalpha(*tas)) {
- rc = MSG_SET_A_INVALID_NUMBER;
- break;
- }
复制代码 "086"判断为八进制转化为0,剩余86,下一位字符是数字则提示无效数字;"2a"判断为十进制转化为2,剩余a,下一位字符是字母也提示无效数字。 |