Какие роли играют знаки минус и одинарные кавычки в операторах if? - PullRequest
1 голос
/ 15 мая 2011

В следующем коде добавление одной и той же буквы к обоим операндам сравнения приводит к изменению результата. Несмотря на то, что - не превышает j, -k превышает jk.

Это происходит только в том случае, если один из операндов является знаком минус (-) или одиночной кавычкой (').

Почему это происходит? Какие правила?

if - gtr j (echo - greater than j) else echo - less than j
if "-" gtr "j" (echo "-" greater than "j") else echo "-" less than "j"
echo.
if -k gtr jk (echo -k greater than jk) else echo -k less than jk
if "-k" gtr "jk" (echo "-k" greater than "jk") else echo "-k" less than "jk"
echo.
if ' gtr u (echo ' greater than u) else echo ' less than u
if "'" gtr "u" (echo "'" greater than "u") else echo "'" less than "u"
echo.
if 'v gtr uv (echo 'v greater than uv) else echo 'v less than uv
if "'v" gtr "uv" (echo "'v" greater than "uv") else echo "'v" less than "uv"

Результат:

- less than j
"-" less than "j"

-k greater than jk
"-k" greater than "jk"

' less than u
"'" less than "u"

'v greater than uv
"'v" greater than "uv"

1 Ответ

2 голосов
/ 15 мая 2011

Вы можете предположить, что строки просто сравниваются символ за символом, принимая их порядковые значения.

Это не так.Сортировка гораздо сложнее.

Фактически, вы можете увидеть то же самое в других средах, таких как Windows PowerShell:

PS Home:\> '-' -gt 'j'
False
PS Home:\> '-k' -gt 'jk'
True
PS Home:\> '''' -gt 'u'
False
PS Home:\> '''v' -gt 'uv'
True

Вполне может быть, что порядок строктакже зависит от вашей локали.

Что касается вашей конкретной проблемы, приведите цитату из Unicode Collation Algorithm (UTS # 10):

Порядок сортировки в общем случае не сохраняется при операциях конкатенации или подстроки.

Например, тот факт, что x меньше y, не означает, что x + z меньше y + z, поскольку символыможет образовывать сокращения через границы подстроки или конкатенации.В итоге:

x x xz zx

и для устранения неправильного понимания вы, вероятно, под:

Сортировка не является кодомТочечный (двоичный) порядок.

Простым примером этого является тот факт, что заглавная буква Z стоит перед строчными a в кодовых диаграммах.Как отмечалось ранее, новички могут жаловаться на то, что конкретный символ Unicode «не в нужном месте в кодовой диаграмме». Это неправильное понимание роли кодировки символов в сопоставлении.В то время как стандарт Unicode не размещает символы так, чтобы двоичное упорядочение было нечетным, единственный способ получить лингвистически правильный порядок - использовать чувствительность к языку, а не двоичное упорядочение.

...