От Паскаля к Си.
Введение.
Статья носит ознакомительный характер.
На полноту изложения я не претендую.
Переход с одного алгоритмического языка на другой не столь труден, как может казаться вначале. Ведь главное в программировании, это алгоритмический тип мышления. То есть умение многократно разбивать крупную задачу на ряд мелких подзадач, до тех пор, пока мелкие задачи не превратятся в элементарные шаги. Элементарные шаги необходимо записать в виде операторов языка, а затем все это обратно синтезировать в исходную задачу. То есть необходимо помнить, что язык программирования это средство, с помощью которого программист записывает свой алгоритм. Сначала этот алгоритм надо составить, а только после этого писать программу. Любой алгоритмический язык состоит из операторов. Разные языки имеют разные составы операторов. Но идеи не так сильно различаются. Итак, начнем рассмотрение с того, что общего между языками Си и Паскаль.
Сходство языков Си и Паскаль.
И Си и Паскаль родились от одной мамы Algol-60. Поэтому у них много общего. И в первую очередь блочная структура языка. Это очень важно. Например, Бейсик не является языком, последовательно проводящим идею блочной структуры, поэтому перейти с Бейсика на Си сложнее.
Паскаль |
Си |
Begin |
{ |
Записываются блоки по-разному, служебные слова
begin end в Паскале и фигурные скобки { } в Си, но идея блочной структуры одна и та же. Блоки допускают вложение в обоих языках, то есть внутри блока могут быть вложены другие блоки.Все переменные должны быть описаны. Так что тут особенно переучиваться нечему.
Почти каждый оператор в Паскале имеет свой аналог в Си. Правда Си позволяет записывать операторы в более компактной форме, чем Паскаль. Потому, одному оператору в Си может соответствовать несколько операторов на Паскале. Но это относится уже к различиям.
Различие языков Си и Паскаль.
Различия я буду приводить в основном в виде таблиц.
Начинаем программу. В Паскале
программа имеет имя, здесь оно myPasc, в Си оно всегда main (это относится к главной программе).
Паскаль |
Си |
program myPasc; begin |
viod main (void) |
При описании переменных в Си не требуется служебного слова
var, и сначала идет тип переменной, а затем имя переменной.
Паскаль |
Си |
var i : integer; |
int i; |
Похоже? Конечно похоже, с поправкой на местный колорит. Но привыкнуть к этому нужно, и не слишком сложно.
Операции.
Если мы производим какие - то операции с одной и той же переменной, то можно сократить запись, указав эту переменную один раз и использовав следующие операции. В Паскале такой операции нет, а те же действия производит обычный оператор присвоения.
Паскаль. |
Си |
|
Операция |
Пример |
|
x := x+y; |
+= |
x += y; |
x := x-2; |
-= |
x -= 2; |
x := x*y; |
*= |
x *= y; |
x := x/y; |
/= |
x /= y; |
x := x MOD y; |
%= |
x %= y; |
x := x shr 2; |
>>= |
x >>= 2; |
x := x shl y; |
<<= |
x <<= y; |
x := x and y; |
&= |
x &= y; |
x := x xor y; |
^= |
x ^= y; |
x := x or y; |
|= |
x |= y; |
В Си есть две операции, + + и - -, выполнение которых зависит от того, где они стоят. А именно, до или после операнда. Их смысл и соответствие операторам Паскаля приводятся в таблице.
Эта таблица относится только к простым переменным. Для указателей их смысл несколько иной.
Паскаль |
Си |
j := j+1; |
j++; |
++j; |
|
j := j-1; |
j - - ; |
- - j; |
|
j:=j+1; |
y=++j; |
y:=j; |
y=j++; |
j:=j-1; |
y=--j; |
y:=j; |
y=j--; |
Обратите внимание на четыре последних строки. В Паскалевской части последовательность операторов меняется, в зависимости от того, где стоит "++" ("--"), слева или справа от переменной. Это очень важный момент при переходе на Си. Если двойной знак стоит слева от переменной, то значение переменной сначала инкрементируется (декрементируется), а уже затем осуществляется присвоение. Это так называемая префиксная операция, то есть "операция до". Если же операция "++" ("--") стоит справа от переменной, тогда инкрементирование (декрементирование) происходит после выполнения соответствующей операции. Это так называемая постфиксная операция, то есть "после". Следует также отметить, что в таких операторах изменяются две переменные, а в более сложных выражениях и больше, причем в одном выражении можно употреблять и те и другие вместе. Благодаря этим возможностям Си очень компактен, но одновременно и более сложен, так как если в одном выражении "накручено" сразу несколько префиксных и постфиксных операций, то разобрать смысл такого выражения понять не очень просто.
Паскаль |
Си |
Оператор выбора.
Паскаль |
Си |
case < ключ выбора > of |
switch (выражение) { |
Здесь аналогия полная, различны лишь ключевые слова, да в Си выражение заключено в скобках. Но вот при выполнении есть одно существенное различие. Если в Паскалевском операторе найден оператор соответствующий условию, то он выполняется, а затем происходит выход из оператора, в Си происходит переход на следующий оператор. Для того чтобы в Си выполнить только один оператор после него должен стоять оператор break.
Паскаль |
Си |
Var c:integer; Readln(c); |
main() |
Паскаль |
Си |
while <выражение> do <оператор> ; |
while (выражение) оператор ; |
Пример использования оператора |
|
while X<5 do S:=S+X*X ; |
while (X<5) S+=X*X; |
Паскаль |
Си |
repeat <тело цикла>until <условие>; |
do <оператор>while (выражение) ; |
Пример использования оператора |
|
repeat <тело цикла>until <условие>; |
do <оператор>while (выражение) ; |
А вот оператор цикла
for требует гораздо большего внимания. В Си этот оператор имеет заметно большие возможности.
Паскаль |
Си |
for <переменная цикла>:= <начальное значение> to <конечное значение> do <оператор> ; |
for (начальные действия; |
Пример схожего использования операторов |
|
for i := 1 to 10 do S:=S+i*i ; |
for ( i=1 ; i<10 ;i++) S+=i*i ; |
Не всякий оператор
for на Си может быть записан аналогично в Паскале, но применяя различные ухищрения и используя операторы break и continue, можно добиться того же эффекта. Существенным в Си является то, что можно использовать комбинированные условия. В этом случае они пишутся через запятую.
Паскаль |
Си |
Примеры различного использования операторов |
|
j:=3; j := i*i; |
for (i = 0, j = 3; i<10,s<50; i++, j+=i*i) s+=i*j; |
В этом примере мы имеем комбинированные условия.
Начальные
: i = 0, j = 3. В Паскале необходимо дополнительные условия выносить за цикл.Условия завершения
: В Си проверяются оба условия, то есть запятая в логическом смысле заменяет символ И. В Паскале необходимо вставлять дополнительный оператор if.Действия после очередного прохода
: А вот здесь надо смотреть за порядком операторов иначе результат будет совсем иной.
Паскаль |
Си |
Паскаль |
Си |
Паскаль |
Си |