Перейти к содержимому

Int temp что это c

  • автор:

Int temp что это c

intob[12] = 100; // Prints error message

2. Исключения.

Механизм исключительных ситуаций позволяет удобно реализовать обработку ошибок, возникающие в ходе выполнения программы. Он основан на ключевых словах try, throw и catch.

Блок try содержит выполняемый код, оператор throw генерирует исключительную ситуацию, блок catch содержит код, обрабатывающий исключительную ситуацию.

Общий вид конструкции механизма исключительных ситуаций:

Int temp;

из-за вызова по значению swapне может воздействовать на аргументыaиbв вызывающей функции.

К счастью, все же имеется возможность получить желаемый эффект. Вызывающая программа передает указатели подлежащих изменению значений:

так как операция &выдает адрес переменной, то&aявляется указателем наa. В самойswapаргументы описываются как указатели и доступ к фактическим операндам осуществляется через них.

swap(int *px, int *py) /* меняет значения *px и *py */

Int temp;

*py = temp;

Указатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения. Можно сказать, что swapвозвращает два значения, новые значения ее аргументов.

В языке C++ существует сильная взаимосвязь между указателями и массивами, настолько сильная, что указатели и массивы действительно следует рассматривать одновременно. Любую операцию, которую можно выполнить с помощью индексов массива, можно сделать и с помощью указателей. Вариант с указателями обычно оказывается более быстрым, но и несколько более трудным для непосредственного понимания, по крайней мере, для начинающего. Описание

int a[10];

определяет массив размера 10, т.е. Набор из 10 последовательных объектов, называемых a[0], a[1], . a[9].Записьa[i]соответствует элементу массива черезiпозиций от начала. Еслиpa— указатель целого, описанный как int *pa; то присваивание pa = &a[0];

приводит к тому, что paуказывает на нулевой элемент массиваa.Это означает, чтоpa содержит адрес элементаa[0].Теперь присваивание x = *pa; будет копировать содержимоеa[0]вx.

Если paуказывает на некоторый определенный элемент массиваa, то по определениюpa+1указывает на следующий элемент, и вообщеpaiуказывает на элемент, стоящий на iпозиций до элемента, указываемогоpa, аpa+iна элемент, стоящий наi позиций после. Таким образом, еслиpaуказывает наa[0],то*(pa+1) ссылается на содержимоеa[1].Выражениеpa+i — это адрес элементаa[i],а*(pa+i)содержимоеa[i].

Эти замечания справедливы независимо от типа переменных в массиве a. Суть определения «добавления 1 к указателю», а также его распространения на всю арифметику указателей, состоит в том, что приращение масштабируется размером памяти, занимаемой объектом, на который указывает указатель. Таким образом,iвpa+iперед прибавлением умножается на размер объектов, на которые указываетpa.

Очевидно, существует очень тесное соответствие между индексацией и арифметикой указателей. В действительности компилятор преобразует ссылку на массив в указатель на начало массива. В результате этого имя массива является указательным выражением. Отсюда вытекает несколько весьма полезных следствий. Так как имя массива является синонимом местоположения его нулевого элемента, то присваивание pa=&a[0]можно записать какpa = a.

Еще более удивительным, по крайней мере, на первый взгляд, кажется тот факт, что ссылку на a[i]можно записать в виде*(a+i).Эти две формы совершенно эквивалентны. Если применить операцию & к обеим частям такого соотношения эквивалентности, то мы получим, что&a[i]иa+iтоже идентичны:a+i— адресi-го элемента от началаa.С другой стороны, еслиpaявляется указателем, то в выражениях его можно использовать с индексом:pa[i]идентично*(pa+i).Любое выражение, включающее массивы и индексы, может быть записано через указатели и смещения и наоборот, причем даже в одном и том же утверждении.

Имеется одно различие между именем массива и указателем, которое необходимо иметь в виду: указатель является переменной, так что операции pa = aиpa++имеют смысл. Но имя массива является константой, а не переменной: конструкции типаa = paилиa++,илиp = &aбудут неправильными.

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

Регистровые переменные

С имеет еще один спецификатор, который первоначально применялся только к переменным int и char. Стандарт ANSI С расширил сферу его применения. Спецификатор register просит, чтобы компилятор сохранил переменную способом, позволяющим осуществлять наибыстрейший доступ. Для целых чисел и символов это обычно подразумевает размещение не в памяти, а в регистрах процессора. Для других типов переменных компилятор может использовать другие способы для уменьшения времени доступа. Компилятор может просто игнорировать данную просьбу.

В Borland С++ спецификатор register может применяться к локальным переменным и формальным параметрам функции. Нельзя применять register к глобальным переменным. Также, поскольку регистровая переменная может быть сохранена в регистре процессора, нельзя получить адрес регистровой переменной. (Данное ограничение присутствует только в С, но не в С++)

В целом операции с регистровыми переменными выполняются гораздо быстрее, чем с переменными, сохраненными в памяти. Фактически, когда значение переменной содержится в процессоре, не требуется доступа к памяти для определения или модификации значения. Это делает регистровые переменные идеальным средством для управления циклами. Ниже приведен пример объявления регистровой переменной типа int и дальнейшего ее использования для управления циклом. Данная функция вычисляет m* для целых чисел.

int int_pwr (register int m, register int e)
register int temp;
temp = 1 ;
for( ; e; e—) temp *= m;
return temp;
>

В данном примере m, e и temp объявлены как регистровые переменные, поскольку они используются в цикле. Обычно регистровые переменные используются там, где они принесут наибольшую пользу, то есть в местах, где делается много ссылок на одну и ту же переменную. Это важно, поскольку не все переменные можно оптимизировать по времени доступа.

Важно понять, что спецификатор register — это просто запрос компилятору, который не обязательно будет удовлетворен. Как правило, можно использовать по крайней мере две регистровые переменные, размещаемые в регистрах процессора, типа char или int. Дополнительные регистровые переменные оптимизируются более продвинутыми компиляторами.

Объясните зачем нужен массив temp в примере!

С++.Для начинающих. Герберт Шилдт.

Подскажите, зачем в приведенном примере инициализируется локальный массив char temp[80] ? Массив не используется, но и объяснений нет никаких, очень странно, в книге не было непонятных моментов до этого. Помогите плз! П.С. Книга «С++.Для начинающих. Герберт Шилдт.»

Отслеживать

задан 25 июл 2017 в 22:00

Nikita Krasnikov Nikita Krasnikov

43 1 1 серебряный знак 9 9 бронзовых знаков

Стандартная ситуация — автор в предыдущем (или еще более раннем) издании писал один текст, потом его правил, ну, и забыл вычистить. А переводчик/редактор не обратил внимания. Это только Кнут выписывает чеки за найденные у него ошибки 🙂 Тут у Шилдта еще ерунда — так, вызывает легкое недоумение, но код работает. Если глянуть на errata к «Книге Дракона», там вообще было обнаружено при подготовке русского и французского переводов в сумме более 300 ошибок и опечаток. Что до C++ — то это вы еще не читали 1 русское издание «Основ программирования» Страуструпа 🙂 Там страшный как раз перевод 🙁

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *