Каким будет вывод этого кода, и можете ли вы объяснить пошаговое продвижение? - PullRequest
0 голосов
/ 23 декабря 2019

Я попробовал этот код и получил вывод ниже. Но я не понял, как это произошло. Какая логика используется в этом фрагменте кода? Можете ли вы объяснить?
Также, когда ++ i заменяется на i ++, он дает другой вывод ??

int main() 
{  
  char i= 0;
  for(i<=5 && i>=-1;++i;i>0) 
    printf("%d\n",i); 
  printf("\n"); 

return 0; 
}

Вывод:

1 2 3 .... 126 127 -128 -127 .... 2 1.

Ответы [ 2 ]

2 голосов
/ 23 декабря 2019

это из-за написанного вами цикла for

for(i<=5 && i>=-1;++i;i>0) 

первый параметр цикла for выполняется один раз. он не проверяет, является ли условие истинным или нет, и не контролирует выполнение цикла. даже если выражение оценивается как 0, цикл начинает выполняться. вторая часть выполняется каждый раз, когда начинается цикл, и это условие прерывания цикла. то есть, если это выражение возвращает 0, оно ломается.

третий раздел выполняется каждый раз, опять же, это не влияет на выполнение цикла.

ЗАМЕТЬ, давайте проанализируем ваш кодя инициализируется до 0, прежде чем войти в цикл. инициализатор цикла for выполняет проверку условия, i<=5 && i>=-1, но не изменяет значение i. секция условия делает приращение к переменной i, что происходит каждый раз, когда она входит в цикл. таким образом, значение изменяется от 0,1,2, .. 127, -128, -127 ...- 1 (так как это знаковый символ , который находится в диапазоне от -128 до 127), а затем достигает 0,что означает ложь. когда значение равно 0, цикл for прерывается. Таким образом, выход вы получили. 3-й раздел снова является условием, которое не обновляет значение.

Вы можете проверить синтаксис цикла и ожидаемый результат.

2 голосов
/ 23 декабря 2019

Это то, что стандарт C говорит о for циклах:

Оператор для

(предложение-1; выражение-2; выражение-3) выражение

ведет себя следующим образом: выражение-выражение-2 является управляющим выражением, которое вычисляется перед каждым выполнением тела цикла. Выражение expression-3 оценивается как пустое выражение после каждого выполнения тела цикла. Если условие-1 является объявлением, область действия любых идентификаторов, которые оно объявляет, является оставшейся частью объявления и всего цикла, включая два других выражения;оно достигается в порядке выполнения до первой оценки управляющего выражения. Если условие-1 является выражением, оно оценивается как пустое выражение перед первой оценкой управляющего выражения.

Цикл for начинает печатать с i, равным 1. i оборачивается после достижения максимально возможного значения для типа данных char. Цикл завершается, когда выражение-2, то есть ++i в этом случае 0. ++i оценивается как 0, когда i равно -1.

Также обратите внимание, что переполнение числа со знаком приводит к неопределенному поведению. Тип данных char может быть подписан или не подписан в зависимости от вашей системы.

...