Сравнение языков программирования (esyr) (1161143), страница 3
Текст из файла (страница 3)
Конструкторпреобразования имеет прототип вида:Х(Т) // или Х(Т&) или X (const Т&)Функция преобразования имеет вид:class X {operator Т();};В языке C# область применения пользовательских преобразований уже, чем в языке C++. Можно определять свои преобразования только между двумяклассами, нельзя определять преобразования в типы значений или из них.
Преобразование из класса X в класс Y реализуется с помощ ью специального метода— функции преобразования:static operator Y (X х) { ... }Функция преобразования может быть только статическим методом либо класса х, либо класса Y. Если такая функция преобразования есть, то она вызывается сиспользованием обычного синтаксиса преобразований: (Y) х. Компилятор вставляет неявное преобразование из X в Y только, если соответствующ ая функцияпреобразования снабжена модификатором implicit:open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comstatic implicit operator Y (X x) { ... }Если же используется модификатор explicit, то функция преобразования может вызываться только явно.
По умолчанию принимается модификатор explicit, чтоснижает вероятность случайной ошибки.В Delphi есть неявное преобразование типов, работает для функций. Пример (не работает для Writeln, потому что это не функция, а конструкция языка):program Overloads;{$APPTYPE CONSOLE}typeTRec = recordprivatefunction GetOrd: Integer;publicclass operator Implicit(const Value: TRec): Integer;property ord: Integer read GetOrd;end;class operator TRec.Implicit(const Value: TRec): Integer;beginResult := 0;end;function TRec.GetOrd: Integer;beginResult := 0;end;procedure Foo(i: Integer);beginend;varR: TRec;a: array[0..0] of Integer;beginWriteln(R);//E2054 Illegal type in Write/Writeln statementWriteln(Integer(R));//explicit cast, provided by class operator ImplicitWriteln(R.ord);//my preferred option, a propertya[R] := 0;//E2010 Incompatible types: 'Integer' and 'TRec'a[Integer(R)] := 0;//again, explicit cast is finea[R.ord] := 0;//or using a propertyFoo(R);//implicit cast used for actual parametersend.Понятия conversion и casting[править]В большинстве языков, основанных на базе Algol и обладающ их механизмом вложенных функций - например, в Ada, Delphi, Modula 2 и Pascal, понятияconversion и casting принципиально различны.
Понятие conversion относится к явному или неявному изменению значения одного типа данных на значение другоготипа данных (например, расширение 16-битного целого до 32-битного). В этом случае, могут измениться требования к объёму выделенной памяти; могутвозникнуть потери точности или округления.
Понятие casting, напротив, обозначает явное изменение интерпретации последовательности бит. Например,последовательность из 32 бит может быть интерпретирована как целое без знака, как массив из 32 значений типа boolean или как вещ ественное число cодинарной точностью, соответствующ ее стандарту IEEE. В C-подобных языках, понятием casting обозначается явное приведение типа в независимости от того,является ли оно изменением интерпретации последовательности бит, либо же настоящ им преобразованием типа.Упаковка и распаковка[править]Данные понятия определены для языков C# и Java.Упаковкой (boxing) называется процесс преобразования значения простого типа значения в экземпляр соответствующ его класса-оболочки.Are you a developer? Try out the HTML to PDF APIopen in browser PRO versionpdfcrowd.comРаспаковкой (unboxing) называется, очевидно, процесс преобразования экземпляра класса-оболочки в значение соответствующ его простого типа.C#[править]В C# упаковка и распаковка выполняются автоматически.Пример упаковки и распаковки:int i = 123;// The following line boxes i.object o = i;o = 123;i = (int) o;// unboxingJava[править]В Java автоупаковка и автораспаковка поддерживаются начиная с J2SE 5.0 (сентябрь 2004 года).Пример упаковки и распаковки:int i = 123;Integer boxedI = Integer.valueOf(i); // boxingInteger boxedI = Integer.valueOf(123);int i = boxedI.intValue(); // unboxingДругие языки[править]В некоторых языках упаковка и распаковка отсутствуют.
Например, в Smalltalk любое значение принадлежит некоторому классу (т.е. даже значения простыхтипов являются экземплярами классов).В JavaScript ситуация несколько иная. Например, есть примитивный тип Number для чисел. В отличие от Java и C#, это тип является полноценным (к объектамэтого типа можно применить операцию typeof). Однако при вызове методов примитивный тип упаковывается в объект, прототипом которого являетсяNumber.prototype(это не тот же самый Number-примитивный тип!), и в котором уже определены нужные методы. Пример кода, который это демонстрирует:Number.prototype.test = function() { return this; }var x = 5;alert(x + " " + typeof x);x = x.test();alert(x + " " + typeof x);Операторный базис языков программирования.
Управление последовательностью вычислений[править]ADA[править]Примечание: в отличие от нижеследующ их языков (таких как Pascal / Delphi и Modula-2), в ADA конструкция with не входит в операторный базис, а служит дляподключения пакетов; см. раздел 7.if condition thenopen in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comif condition thenstatement;elseif enother_condition thenenother_statement;...elselast_one_statement;end if;case X iswhen constant1 =>stetement1;when constant2 | constant3 =>statement2_and3;...when others =>other_statement;end case;return; -- for proceduresreturn Value; -- for functionsgoto LabelDont_Do_Smth;<<Label>>Циклы устроены посложнее:Endless_Loop :loopDo_Something;end loop Endless_Loop;While_Loop :while X <= 5 loopX := Calculate_Something;end loop While_Loop;Until_Loop :loopX := Calculate_Something;exit Until_Loop when X > 5;end loop Until_Loop;Exit_Loop :loopX := Calculate_Something;exit Exit_Loop when X > 5;Do_Something (X);end loop Exit_Loop;For_Loop :for I in Integer range 1 ..
10 loopDo_Something (I)end loop For_Loop;(Замечание: именовать циклы необязательно.)open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comОБЕРОН И ОБЕРОН-2[править]Операторы в последовательности операторов идут через точку с запятой. В конце последовательности должна стоять точка.Пайп-символы «|» — это обязательная деталь конструкций CASE и WITH (они разделяют альтернативные варианты, за исключением умолчательного,задаваемого после ключевого слова ELSE).IF Выражение THEN ПоследовательностьОператоров{ELSIF Выражение THEN ПоследовательностьОператоров}[ELSE ПоследовательностьОператоров]END.CASE ch OF"A" .. "Z": ReadIdentifier |"0" ..
"9": ReadNumber |"'", '"': ReadStringELSE SpecialCharacterEND.WHILE Выражение DOПоследовательностьОператоровEND.REPEATПоследовательностьОператоровUNTIL Выражение.FOR v := начало TO конец BY шаг DOПоследовательностьОператоровEND.(* Присутствует только в Оберон-2 *)LOOPПоследовательностьОператоровEND.(* Вечный цикл; для выхода используется ключевое слово EXIT *)WITHДискриминант: Значение1 DO ПоследовательностьОператоров1 |Дискриминант: Значение2 DO ПоследовательностьОператоров2ELSE ПоследовательностьОператоров3END.(* Является подобием оператора CASE-OF по дискриминантуразмеченного объединения; присутствует только в Оберон-2 *)Modula-2[править]Полностью совпадает с Обероном-2, за исключением WITH, определяемого так:WITH ПеременнаяСтруктурногоТипа DOПоследовательностьОператоровПоле1:= Значение1;ПоследовательностьОператоровПоле2:= Значение2;…open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.com…END.(* Поле1, Поле2, итд.
— поля переменной «ПеременнаяСтруктурногоТипа»;конструкция с аналогичным поведением есть в Pascal и Delphi *)Pascal и Delphi[править]if condition1 then beginstatement1;statement2;…end { заметьте, точки с запятой нет }else if condition2 then begin…endelse begin…end; { if-блок закончен, точка с запятой есть }case value1 ofconstant1: beginstatement1;statement2;…end;constant2: begin…end;…else begin…end;end;goto label1; { да, в стандарте Паскаля это было }never_executed_statement1;never_executed_statement2;…label1:for variable1 := constant1 to constant2 do beginstatement1;statement2;…end; { если constant1 > constant2, используется downto }while continuation do beginstatement1;statement2;…end;repeatstatement1;statement2;…until discontinuation;open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.comuntil discontinuation;{ здесь, discontinuation означает условие останова, а непродолжения (как, например, в цикле предыдущего типа);также заметьте, что скобки begin / end тут не нужны }with struct1.substruct1.subsubstruct1 do beginfield1 = value1;field2 = value2;…end;{ field1 и field2 — это поля структуры struct1.substruct1.subsubstruct1;в этом блоке они перекрывают собой любые переменные с теми же именами }C и C++[править]if (condition1) {statement1;statement2;…}else if (condition2) {…}else {…}return;// возврат из void-функцииreturn value1; // возврат из функции, отдающей значениеswitch (value1) {case constant1:statement1;statement2;…break;case constant2:…break;…default:…break;}// также вместо break можно использовать return (выходим не только из switch-блока, но и из функции).goto label1;never_executed_statement1;never_executed_statement2;…label1:for (initializer; continuation; increment) {statement1;statement2;…}open in browser PRO versionAre you a developer? Try out the HTML to PDF APIpdfcrowd.com}// любые из трёх выражений в заголовке цикла могут пустовать.// например, for ( ; ; ) {} даст вечный цикл.do {statement1;statement2;…} while (continuation);while (continuation) {statement1;statement2;…}for в C# и Java[править]В Java используется 2 формы оператора цикла for.