Выражения вида
(row||column=lim1)
не означают ничего похожего на то, что, как вы думаете, они означают.
Во-первых, column=lim1
часть является присваиванием , а не проверкой на равенство. В тестах на равенство используется оператор ==
. С другой стороны, в C присваивания являются выражениями (они оцениваются по присвоенному значению), поэтому они могут отображаться как подвыражения больших выражений, как здесь. В логическом контексте значение ноль представляет ложь, а любое другое значение представляет истину. lim1
начинается с 1 и отсчитывается, поэтому его значение никогда не оценивается как истинное (если оно не рассчитывает до тех пор, пока не вернется к нулю).
Но более существенной проблемой является использование ||
оператор. Мое лучшее предположение состоит в том, что вы имеете в виду вышеприведенный отрывок для express условие, которое либо row
, либо column
равно lim1
, но это вовсе не означает. Вместо этого он выражает условие, что либо row
не равен нулю ( т.е. true), либо результат column=lim1
не равен нулю. Поскольку row
начинается с 1 и не изменяется во внутреннем l oop, это общее выражение всегда будет иметь значение true.
Более того, C гарантирует, что если левый операнд * Оператор 1026 * оценивается как true, тогда правый операнд даже не оценивается (поскольку это не требуется для определения результата операции).
Условие, которое, как вам кажется, нужно express, может пишется так:
((row == lim1) || (column == lim1))
Подобные изменения необходимы в другой половине внутреннего состояния l oop.