Рейтинг:  1 / 5

Звезда активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 

Как уже было сказано, тип данных определяет не только то, как хранится в памяти данные данного типа, но и определяет то, что с данными этого типа можно делать и что переменным данного типа можно присваивать. В Pascal, как и во многих других языках переменным одного типа нельзя присваивать переменные другого типа. Если Вы попытаетесь это сделать, то компилятор Вам выдаст ошибку (поскольку у переменных разного типа совершенно разное внутреннее представление. Кроме того мы сейчас изучаем статические переменные (память для которых выделяется сразу же при запуске программы), а для таких переменных перевыделить память нельзя. Поэтому присваивать переменным другой тип в большинстве случаев нельзя). Но несмотря на это все же есть некоторые исключения по присваиванию.

1) вещественным переменным можно рисваивать переменные целого типа. Ну это совсем очевидное исключение, поскольку, например, число 5 и число 5*100 это одно и то же, и преобразование из одного типа в другой совершить очень легко.

 

 
begin 

 
  var r:real:=3; 

 
  var i:integer:=5; 

 
  r:=i; 

 
end. 

 

Данный код без каких-либо проблем будет выполнен, чего нельзя сказать о следующем коде:

 

 
begin 

 
  var r:real:=5; 

 
  var i:integer:=r; 

 
end. 

 

При попытке компиляции будет сразу же выдана ошибка о несовместимости типов, хотя в переменной r записано число "5", являющееся целым. Если Вы читали статьи Представление целых чисел. и Представление вещественных чисел, то Вы наверняка поняли почему. Если нет, тогда обьясню: компьютеру преобразовать число 5 в число 5*10не состовляет никакого труда, чего не скажешь об обратном преобразовании. Компьютер просто-напросто не может избавиться от порядка в вещественном числе.

2) Символы можно присваивать строке. Это тоже очевидное преобразование типа, поскольку строка - это набор символов, то совершенно естественно, что набору из символов можно присвоить один символ.

 

 
begin 

 
  var c:char:='a'; 

 
  var s:string:=c; 

 
end. 

 

Как Вы поняли этот код будет выполнен без каких-либо проблем. Однако, как и в первом случае, присваивание в обратно последовательности не работает.

Теперь поговорим о присваивании. Как оно работает и что это вообще такое.

Когда мы в програмном коде обьявляем переменную, то компилятор в уже машинном коде (код программы, которую выполняет ОС) ставит специальные комманды о том, что Вашей программе требуется переменная того или иного типа и компьютер на этапе выполнения (когда программа будет запущена) выделяет сразу же память под все Ваши переменные (некоторые среды программирования оптимизирую выделение памяти и память под переменные выделяется по ходу выполнения, но PascalABC.NET не проводит такую оптимизацию). После выделения памяти все переменные имеют свои значения по - умолчанию (для целого и вещественного типа это 0). После этого компьютер начинает выполнять уже написанный код. Чтобы сохранить значения и пользоваться ими в дальнейшем была сделана в Паскале комманда ":=" (двоеточие равно), которая обозначает присваивание (то есть переменной, стоящей слева от этого набора символов присваивается все, что стоит справа от этого символа, при этом это все будет первоначально обработано как програмный код. Таким образом после присваивания в память, отведенной той или иной переменной будет записано новое значение.

Вообще в Паскале, как и в некоторых языках, есть сокращенное присваивание. Это присваивания вида:

 

 
var i:real; 

 
begin 

 
  i+=1; 

 
  i*=2; 

 
  i-=1; 

 
  i/=2; 

 
end. 

 

Этот код был написан в сокращенной форме. И в полне очевидно, что "i+=1;" эта строка означает, что к значению переменной i нужно прибавить 1; "i*=2;" оначает, что значение переменной i нужно умножить на 2. И так далее. Эти формы присваивания называю сокращенными, поскольку позволяют писать выражения не полностью. Таким образом следующий код абсолютно эквивалентен предыдущему.

 

 
var i:real; 

 
begin 

 
  i:=i+1; 

 
  i:=i*2; 

 
  i:=i-1; 

 
  i:=i/2; 

 
end. 

 

А вообще, честно говоря компилятор первый код все равно преобразует во второй, поэтому нет никакой разницы: каким стилем писать (полным или сокращенным).