В.В. Кулямин - Технологии программирования. Компонентный подход (1133554), страница 44
Текст из файла (страница 44)
Его параметр представляетсобой массив строк, передаваемых какпараметры командной строки при запуске.При этом полное имя класса, чей метод main()выбирается в качестве входной точки,указывается в качестве параметра виртуальноймашине при запуске (параметры команднойстроки следуют за ним).одного из классов. Такой метод может такжеиметь параметр типа string[](представляющий параметры команднойстроки, как и в Java) и/или возвращать значениетипа int.Класс, чей метод выбирается в качествевходной точки, указывается в качествестартового класса при сборке исполняемогофайла. Собранный таким образом файл всегдабудет запускать метод Main() указанногокласса.Ниже приведены программы на обоих языках, вычисляющие и печатающие на экране значениефакториала неотрицательного целого числа (0! = 1, n! = 1·2·…·n), передаваемого им в качествепервого аргумента командной строки.
Также приводятся командные строки для их компиляции изапуска.В отличие от Java, параметры компилятора и способ запуска программ в C# нестандартизованы. Приведена командная строка для компилятора, входящего в состав MicrosoftVisual Studio 2005 Beta 2. Предполагается, что директории, в которых находятся компиляторы,указаны в переменной окружения $path или %PATH%, и все команды выполняются в той жедиректории, где располагаются файлы с исходным кодом.Компилятор Java и Java-машина располагаются в поддиректории bin той директории, вкоторую устанавливается набор для разработки Java Development Kit. Компилятор C#располагается в поддиректории Microsoft.NET\Framework\v<номер версии установленнойсреды .NET> системной директории Windows (обычно Windows или WINNT).using System;public class Counter{public int factorial(int n){if(n == 0) return 1;else if(n > 0)return n * factorial(n - 1);elsethrow new IllegalArgumentException("Argument should be >= 0, " +"current value n = " + n);}public static void main(String[] args){int n = 2;if(args.length > 0){try{n = Integer.parseInt(args[0]);}catch(NumberFormatException e){n = 2;}}public class Counter{public int Factorial(int n){if (n == 0) return 1;else if (n > 0)return n * Factorial(n - 1);elsethrow new ArgumentException("Argument should be >= 0, " +"current value n = " + n);}public static void Main(string[] args){int n = 2;if (args.Length > 0){try{n = Int32.Parse(args[0]);}catch (Exception){n = 2;}}146}}if(n < 0) n = 2;Counter f = new Counter();System.out.println(f.factorial(n));}}if (n < 0) n = 2;Counter f = new Counter();Console.WriteLine(f.Factorial(n));КомпиляцияКомпиляцияjavac Counter.javacsc.exe Counter.csВыполнениеВыполнениеjava Counter 5Counter.exe 5РезультатРезультат120120Базовые типы и операции над нимиВ обоих рассматриваемых языках имеются ссылочные типы и типы значений.
Объектыссылочных типов имеют собственную идентичность, на такой объект можно иметь ссылку издругого объекта, они передаются по ссылке, если являются аргументами или результатамиметодов. Объекты типов значений представляют собой значения, не имеющие собственнойидентичности, — все равные между собой значения неотличимы друг от друга, никак нельзясослаться только на одно из них.В обоих языках есть примитивные типы, являющиеся типами значений, для представленияпростых данных: логических, числовых и символьных.В Java только примитивные типы являютсятипами значений, все другие типы —ссылочные, являются наследниками классаjava.lang.Object.Для каждого примитивного типа есть классобертка, который позволяет представлятьзначения этого типа в виде объектов.Между значениями примитивного типа иобъектами соответствующего ему классаобертки определены преобразования поумолчанию — упаковка и распаковка(autoboxing и auto-unboxing, введены в Java 5),позволяющие во многих случаях не создаватьобъект по значению и не вычислять значение пообъекту явно.
Но можно производить их и явно.Однако вызывать методы у значенийпримитивных типов нельзя.В C# есть возможность декларироватьпользовательские типы значений —структурные типы и перечисления. Ссылочныетипы называются классами и интерфейсами.Структурные типы, так же как и ссылочные,наследуют классу System.Object, которыйтакже можно использовать под именем object.Для каждого примитивного типа естьструктурный тип-обертка. Преобразованиямежду ними производятся неявно, компиляторсчитает их различными именами одного и тогоже типа.Поэтому все элементы класса object имеютсяво всех примитивных типах — у их значенийможно, как у обычных объектов, вызыватьметоды.Вполне законны, например, выражения2.Equals(3) и (-175).ToString().Логический типВ Java он назван boolean, а его обертка — java.lang.Boolean.В C# он назван bool, а его обертка — System.Boolean.Значения этого типа — логические значения, их всего два — true и false.
Нет никакихнеявных преобразований между логическими и целочисленными значениями. Над значениямиэтого типа определены следующие операции.•== и != — сравнения на равенство и неравенство.•! — отрицание.147•&& и || — условные (короткие) конъюнкция и дизъюнкция (‘и’ и ‘или’).
Второй аргументэтих операций не вычисляется, если по значению первого уже ясно, чему равно значениевыражения, т.е., в случае конъюнкции — если первый аргумент равен false, а в случаедизъюнкции — если первый аргумент равен true. С помощью условного оператора ?: ихможно записать так: (x && y) — ((x)?(y): false), (x || y) — ((x)? true :(y)).Напомним, что означает условный оператор — выражение a?x:y вычисляет значение a,если оно true, то вычисляется и возвращается значение x, иначе вычисляется ивозвращается значение y.•& и | — (длинные) конъюнкция и дизъюнкция (‘и’ и ‘или’).
У этих операций обааргумента вычисляются всегда.•^ — исключающее ‘или’ или сумма по модулю 2.•Для операций &, |, ^ имеются соответствующие операторы присваивания &=, |=, ^=.Выражение x op= y, где op — одна из операций &, |, ^, имеет тот же эффект, что ивыражение x = ((x) op (y)), за исключением того, что значение x вычисляется ровноодин раз.Целочисленные типыВ обоих языках имеются следующие целочисленные типы.• Тип байтовых целых чисел, называемый в Java byte, а в C# — sbyte. Его значения лежатмежду -27 и (27-1) (т.е. между -128 и 127)• short, чьи значения лежат в интервале -215 – (215-1) (-32768 – 32767)31•int, чьи значения лежат в интервале -2•long, чьи значения лежат в интервале -2– (231-1) (-2147483648 – 2147483647)63– (263-1) (-9223372036854775808 –9223372036854775807)Классы-обертки целочисленных типовназываются так:В C# имеются беззнаковые аналоги всехперечисленных выше типов:свой тип byte со значениями от 0 до (28-1 =255).16ushort со значениями от 0 до (2 -1) = 6553532uint со значениями от 0 до (2 -1) = 429496729564ulong со значениями от 0 до (2 -1) =18446744073709551615Типы-обертки целочисленных типовназываются так:java.lang.Bytejava.lang.Shortjava.lang.Integerjava.lang.LongSystem.SByteSystem.ByteSystem.Int16System.UInt16System.Int32System.UInt32System.Int64System.UInt64Минимальные и максимальные значенияпримитивных типов можно найти в их типахобертках в виде констант (static final полей)MIN_VALUE и MAX_VALUE.Минимальные и максимальные значенияпримитивных типов можно найти в их типахобертках в виде констант MinValue и MaxValue.Над значениями целочисленных типов определены следующие операции.•==, != — сравнение на равенство и неравенство.148•<, <=, >, >= — сравнение на основе порядка.•+, -, *, /, % — сложение, вычитание, умножение, целочисленное деление, взятиеостатка по модулю.•++, -- — увеличение и уменьшение на единицу.
Если такой оператор написан дооперанда, то значение всего выражения совпадает с измененным значением операнда, еслипосле — то с неизмененным.В результате выполнения последовательности действийx = 1; y = ++x; z = x++;значение x станет равно 3, а значения y и z — 2.•~, &, |, ^ — побитовые операции дополнения, конъюнкции, дизъюнкции иисключающего ‘или’.•<<, >> — операторы, сдвигающие биты своего первого операнда влево и вправо на числопозиций, равное второму операнду.В Java оператор >> сдвигает вправо биты числа,дополняя его слева значением знакового бита —нулем для положительных чисел и единицейдля отрицательных.Специальный оператор >>> используется длясдвига вправо с заполнением освобождающихсяслева битов нулями.•В C# оператор >> сдвигает вправо биты числа,дополняя его слева для чисел со знакомзначением знакового бита, а для беззнаковыхчисел — нулем.Для операций +, -, *, /, %, ~, &, |, ^, <<, >> (и Java-специфичной операции >>>)имеются соответствующие операции присваивания.
При этом выражение x op= y, где op— одна из этих операций, эквивалентно выражению x = (T)((x) op (y)), где T — тип x,за исключением того, что значение x вычисляется ровно один раз.В Java результаты арифметических действийвычисляются в зависимости от типа этихрезультатов, с отбрасыванием битов,«вылезающих» за размер типа.Таким образом, эти операции реализуютарифметику по модулю 2n для n, подходящегодля данного типа.Арифметические операции над целыми числамиприводят к созданию исключений только в трехслучаях: при делении на 0 или вычисленииостатка по модулю 0, при конвертации впримитивный тип ссылки на объект классаобертки, равной null, а также при исчерпаниидоступной Java-машине памяти, которое можетслучиться из-за применения операций -- и ++ содновременным созданием объектов классовоберток.В C# результат арифметических действий надцелочисленными данными, приводящих кпереполнению, зависит от контекста, в которомэти действия производятся.Если действие происходит в uncheckedконтексте (т.е.