2016-03-03 4 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 не равен И не меньше И не больше, чем 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

Да, я полностью осведомлен о целых числах 32Bit и их ограничении. Но мой вопрос не о 'set/a', а о' if'. Когда 'if'" обнаруживает "не (INT32) -number, не следует ли вместо этого использовать сравнение строк? (и да, я знаю, ставя обе стороны в кавычки _forces_ string, но это не мой вопрос) – Stephan

+1

Преобразование в сравнение строк по большому числу может быть желательным. Это просто не похоже на то, что делает 'cmd'. Если коду угрожает такое большое количество, почему бы не процитировать их и не двигаться дальше. Вы думаете о том, чтобы сэкономить пару микросекунд от часов? Если это так, следует выбрать другой язык. – lit

+0

'cmd' обрабатывает его как строку - если нет, будут ошибки синтаксиса или переполнения. Также 'echo on' показывает, что он анализируется как есть. Это '' '' '' ', который не может справиться с этим и всегда дает TRUE с' equ', 'geq' и' leq' и всегда FALSE с 'equ',' geq' и 'leq'. Я хочу понять, почему. – Stephan

Смежные вопросы