麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > BAT > 正文

一個(gè)“靈異”批處理引發(fā)的思考加補(bǔ)充說(shuō)明

2020-07-26 20:29:36
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
批處理的要求是:隨機(jī)顯示的數(shù)字為(6,7,8,9,10,11,12,14,15,16,17)為其中的一個(gè)

注:里面沒(méi)有13的

下面的兩個(gè)代碼,第一個(gè)出錯(cuò),第二個(gè)卻成功了,但他們的區(qū)別只是第一個(gè)(%random%)%%(%n%)+1運(yùn)算后的值賦予%tn%,而第二個(gè)則將運(yùn)算后的值繼續(xù)賦予%n%……
復(fù)制代碼 代碼如下:

@echo off 
set "string=6 7 8 9 10 11 12 14 15 16 17" 
for %%i in (%string%) do call set /a "n=%%n%%+1" 
set /a "tn=(%random%)%%(%n%)+1" 
for /f "usebackq tokens=%tn% delims= " %%i in ('%string%') do echo %%i 
pause 
goto :EOF 

復(fù)制代碼 代碼如下:

@echo off 
set "string=6 7 8 9 10 11 12 14 15 16 17" 
for %%i in (%string%) do call set /a "n=%%n%%+1" 
set /a "n=(%random%)%%(%n%)+1" 
for /f "usebackq tokens=%n% delims= " %%i in ('%string%') do echo %%i 
pause 
goto :EOF 

發(fā)現(xiàn)set /a "tn=(%random%)%%(%n%)+1"這個(gè)語(yǔ)句里面被賦值的變量名稱只能是一個(gè)字符的,多于一個(gè)字符也會(huì)出錯(cuò)(測(cè)試過(guò),和for無(wú)關(guān)),但如果把賦值表達(dá)式兩邊的引號(hào)也去掉,則不會(huì)出現(xiàn)這個(gè)錯(cuò)誤!

狂倒……
for %%i in (%string%) do call set /a "n=%%n%%+1"

這個(gè)語(yǔ)句讓偶理解了好半天:
我們知道批處理在運(yùn)行過(guò)程中,在讀取每條語(yǔ)句/執(zhí)行每個(gè)命令都會(huì)擴(kuò)充一次語(yǔ)句/命令里的變量。
我們來(lái)看看這個(gè)例子發(fā)生了什么事情:
在讀取for語(yǔ)句時(shí),%%n%%被擴(kuò)充為%n%,即do的是call set /a "n=%n%+1"。
此時(shí)我們也許會(huì)認(rèn)為直接set /a "n=%n%+1"不就行了嗎,call是多此一舉。
但是,實(shí)際上在這個(gè)例子里,如果省略call,set命令會(huì)出錯(cuò),提示“找不到操作數(shù)。”
為什么呢?因?yàn)樽x取for時(shí)已經(jīng)擴(kuò)充過(guò)一次,所以for語(yǔ)句會(huì)剝奪do后第一個(gè)命令擴(kuò)充變量的權(quán)力。
所以,省略call后,set不再擴(kuò)充%n%,認(rèn)為%n%不是數(shù)字,所以出錯(cuò)了。
經(jīng)過(guò)call之后,set命令再次擴(kuò)充%n%,即使%n%未賦值也能被擴(kuò)充為空,此時(shí)就可以進(jìn)行set運(yùn)算了。
即call并沒(méi)有擴(kuò)充變量,只是起到了把set命令與for語(yǔ)句隔開的作用,讓set不被for剝奪擴(kuò)充變量的權(quán)力。
當(dāng)然,你認(rèn)為是call擴(kuò)充的也可以,效果一樣,雖然實(shí)際過(guò)程不相同。
當(dāng)%%i=6時(shí),%n%被擴(kuò)充為空,set把n賦值為1
當(dāng)%%i=7時(shí),%n%被擴(kuò)充為1,set把n賦值為2
當(dāng)%%i=8時(shí),%n%被擴(kuò)充為2,set把n賦值為3
以此類推。

舉例理解:
set n=123
for %%i in (1) do echo %%n%%
pause

在運(yùn)行這個(gè)批處理的時(shí)候,我們看到的是for %i in (1) do echo %n%
即是說(shuō),讀取for語(yǔ)句的時(shí)候,%%n%%已經(jīng)被擴(kuò)充為%n%
如果echo還具有擴(kuò)充變量的權(quán)力,echo %n%應(yīng)該顯示%n%的真實(shí)值123
實(shí)際上,echo原原本本的顯示“%n%”
說(shuō)明,for把echo擴(kuò)充變量的權(quán)力剝奪了。

當(dāng)然,您平時(shí)一定是直接for %%i in (1) do echo %n%
但是,這個(gè)“靈異”批處理是想引用一個(gè)不被for擴(kuò)充的變量,而又想在do里能夠得到擴(kuò)充,也就是說(shuō)想達(dá)到延遲環(huán)境變量的效果。目的就是使用一個(gè)遞增變量統(tǒng)計(jì)%string%包含了多少個(gè)字符。

偶對(duì)六翼刺猬的無(wú)限崇敬,有如滔滔長(zhǎng)江,連綿不絕,又如黃河泛濫,一發(fā)而不可收拾!
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产网站黄 | 欧美精品一区二区三区在线 | 最新av在线免费观看 | 国产美女精品视频 | 成人免费视频视频在线观看 免费 | 视频www| 蜜桃av鲁一鲁一鲁一鲁 | 久久久久国产成人精品亚洲午夜 | 免费国产之a视频 | 精品国产精品久久 | 中文字幕免费一区 | 欧美福利视频一区二区 | 午夜视频在线观看免费视频 | 日韩午夜片 | 男女隐私免费视频 | av影院在线播放 | 久久精品二区 | 久久精品日产第一区二区三区 | 久产久精品 | 精精国产xxxx视频在线播放7 | 国产91一区二区三区 | 全黄性性激高免费视频 | h视频在线免费观看 | 国产自在线 | 一级做a爱片性色毛片高清 日本一区二区在线看 | 成人午夜天堂 | 国产不卡av在线 | 免费国产a | 蜜桃成品人免费视频 | 亚洲国产网站 | wankzhd| 亚州综合图片 | 99re热视频这里只精品 | 欧美视频一区二区三区四区 | 久久草在线视频免费 | 91毛片网站 | 韩国一大片a毛片 | 国产91精品亚洲精品日韩已满 | 91看片在线观看视频 | 在线看毛片的网站 | 欧美成人午夜 |