Разница между {} и "" в цикле while - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь выяснить, почему в этом примере цикл while продолжается бесконечно.Дано объяснение:

Если тест помещен в кавычки, фаза замещения заменит любые переменные с их текущим значением и передаст этот тест команде while для оценки, поскольку тест имеет толькочисла, он всегда будет оцениваться одинаково

Я знаю, что обычно вы просто используете фигурные скобки вместо кавычек, но я хочу понять, почему двойные кавычки не используются.Я также понимаю, что двойные кавычки заменят значения, а фигурные скобки - нет.

set x 0
while "$x < 5" {
    set x [expr {$x + 1}]
    if {$x > 7} break
    if "$x > 3" continue
    puts "x is $x"
}

когда я печатаю x в цикле, я вижу его приращение, поэтому в случае x равен 5. Я ожидаю, что строка «set x» изменит значение на 6 и пропустит строку разрыва.Я ожидаю, что строка x> 3 пройдет, как получится, когда она проверяет «$ x <5», что «6 <5» все еще интерпретируется как истина? </p>

1 Ответ

3 голосов
/ 05 июня 2019

Когда tcl пытается оценить оператор while, первое, что он делает, - разбивает оператор на слова и подставляет все, что заключено в двойные кавычки или квадратные скобки. Данные в фигурных скобках не подставляются.

Это происходит до вызова команды while. После этого раунда подстановки результат всех подстановок передается команде while в качестве аргументов.

Таким образом, оператору while дается два аргумента:

  1. 0 <5 </li>
  2. все внутри фигурных скобок

while видит статическое состояние, которое никогда не меняется, поэтому цикл работает вечно.

Вы должны использовать фигурные скобки, чтобы tcl передавал условие команде while на каждой итерации:

while {$x < 5} { ... }

С учетом вышеизложенного, while получает следующие аргументы:

  1. $ х <5 </li>
  2. все внутри фигурных скобок
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...