Вопрос № 142872: Здравствуйте, что-то из этого я знаю, что-то нет. Хочу провериться и узнать. Помогите: for (i = 0; i < n; ++i) if (a[i] == x) break; Что делает этот код? Опишите его действие как можно полнее. Выпишите все операции, кото...
Вопрос № 142.872
Здравствуйте, что-то из этого я знаю, что-то нет. Хочу провериться и узнать. Помогите: for (i = 0; i < n; ++i) if (a[i] == x) break; Что делает этот код? Опишите его действие как можно полнее. Выпишите все операции, которые выполняются в типичной итерации, в виде кусочков кода на языке C. Что будет, если заменить ++i на i++ в этом коде? Какая операция быстрее выполнится: j = i++ или j = ++i, если j и i целые? А если j и i пользовательского типа?
Отвечает: Лысков Игорь Витальевич
Здравствуйте, Капранов Павел Павлович! В коде идет циклическая проверка на равенство значений элементов массива и величины Х. При первом совпадении произойдет выход из цикла, при этом i останется равным индексу найденного элемента массива. Если же совпадения не будет, то весь массив просмотрится до конца и i будет равно n. Например, пусть имеем n=5, a[5] = {1, 2, 3 , 4, 5} и Х=3. Тогда будет выполнена следующая последовательность команд: i=0; //начальная инициализация goto
compare continue: //тело цикла if a[i] == X then goto next; ++i; //изменения счетчика цикла compare: if i<n then goto continue; //проверка условия цикла next: //следующий оператор за циклом На метку next попадем при i==2...
В этом коде без разницы i++ или ++i... В чем суть этих операторов? i++ - сначала используется значение переменной, а после инкрементируется. ++i - сначала инкрементируется, только потом используется. О
тсюда имеем, что отличия скажутся только если будем использовать значение переменной и одновременно инкрементируем. Например, Пусть i=6, тогда если запишем a[i++] = B или a[++i] = B, то что получим? В первом случае: присвоим a[6]=B и после этого i станет равным 7 А во втором: сначала присвоим i=7, и после этого получим a[7]=B По скорости j = i++ и j = ++i совершенно одинаковы при любом типе.
--------- Удачи!
Ответ отправил: Лысков Игорь Витальевич (статус: Специалист)
Ответ отправлен: 02.09.2008, 10:00