2016-03-03 192 views
0

this question的啓發和它的答案,我做了一些測試。 一個答案表明,數字太大(超出32位整數),它們會被截斷,但這並不能解釋結果。顯然,它不會比較雙方的字符串(正如我所預料的那樣)。看起來if感到困惑,並認爲「好吧,我不知道 - 給它一個真實的」。 (使用neq,gtr,lss而不是equ,geq,leq總是給出錯誤)。奇怪的結果與IF

如果任何a和/或b位於32位整數的邊界內或包含[0-9]中的任何字符,則代碼將按預期工作。

@echo off 
set a=333333333333 
set b=444444444444 
call :compare 
set b=222222222222 
call :compare 
goto :eof 

:compare 
echo comparing %a% with %b% 
if %a% geq %b% (echo a ^>= b) else (echo -) 
if %b% geq %a% (echo b ^>= a) else (echo -) 
if %a% leq %b% (echo a ^<= b) else (echo -) 
if %b% leq %a% (echo b ^<= a) else (echo -) 
if %a% equ %b% (echo a = b) else (echo -) 
if %a% == %b% (echo a == b) else (echo -) 

這是否有任何合乎邏輯的解釋,還是僅僅是我們不得不忍受的事情?

+0

你期待什麼發生?鏈接回到「這個問題」並沒有提供背景使這成爲一個獨立的問題。 – Teepeemm

+0

我希望或者是一個字符串比較或者一個錯誤消息,但是**不是** _string1不等於AND並不小於AND不大於string2_所有在同一時間(並且它顯然沒有數字(從某種意義上說, cmd「的作品 - 這意味着不是一個32位INT),我希望它被作爲字符串處理)。 'echo on'清楚地表明,沒有截斷或轉換髮生,所以它似乎不是'cmd'解析問題,而是'if'本身的問題。我想了解,發生了什麼,爲什麼。 – Stephan

+0

[相關問題](http://stackoverflow.com/q/34491952/2152082) – Stephan

回答

1

這是一個限制。

C:>set /A a=333333333333 
Invalid number. Numbers are limited to 32-bits of precision. 
+0

是的,我完全瞭解32位整數及其限制。但我的問題不是關於'set/a',而是關於'if'。當'if'「檢測到」非(INT32) - 數字時,它不應該使用字符串比較嗎? (是的,我知道,把雙方放在引號_forces_字符串比較,但這不是我的問題) – Stephan

+1

轉換爲字符串比較大數可能是一個理想的事情。它看起來並不是'cmd'的功能。如果代碼有這麼大數量的危險,爲什麼不引用它們並繼續前進?你是否想過節省幾微秒的時間?如果是這樣,應選擇另一種語言。 – lit

+0

'cmd'將它作爲一個字符串處理 - 如果沒有,則會出現語法或溢出錯誤。此外,'echo on'顯示,它被解析。它是'if'本身,它無法處理它,並總是以'equ','geq'和'leq'給出TRUE,並且總是以'equ','geq'和'leq'爲假。我想明白爲什麼。 – Stephan