Приоритет и ассоциативность операторов C влияют на группировку и вычисление операндов в выражениях. Приоритет оператора имеет значение только в том случае, если рядом стоят другие операторы с более высоким или более низким приоритетом. Выражения с операторами с наивысшим приоритетом вычисляются первыми. Приоритет также можно описать с помощью термина «привязка». Про операторы с более высоким приоритетом говорят, что они имеют более тесную привязку.
В следующей таблице указывается приоритет и ассоциативность (порядок вычисления операндов) операторов C, которые перечислены в порядке убывания приоритета. Если в одной строке отображается несколько операторов, они имеют равный приоритет и вычисляются с учетом их ассоциативности. Операторы, перечисленные в этой таблице, рассматриваются в разделе Постфиксные операторы. В остальной части этого раздела приводятся общие сведения о приоритете и ассоциативности.
Приоритет и ассоциативность операторов C
[ ] ( ) . ->
Пример с приоритетами операторов и порядком вычисления аргументов (занятие16 часть 4)
|
Выражение | Слева направо | |||||
sizeof | Побитовый сдвиг | Слева направо | |||||
< >= | Реляционный | Слева направо | |||||
== != | Равенство | Слева направо | |||||
>= , | или ^ ). Порядок операций не определен языком. Если компилятор может гарантировать согласованный результат, то он может вычислять такие выражения в любом порядке.
Только операторы последовательного вычисления ( , ), логический оператор AND ( ), логический оператор OR ( || ), операторы условных выражений ( ? : ) и операторы вызова функции создают точки следования и тем самым гарантируют определенный порядок вычисления своих операндов. Оператор вызова функции представляет собой пару скобок, следующих за идентификатором функции. Оператор последовательного вычисления ( , ) гарантирует, что его операнды будут вычисляться слева направо (оператор-запятая в вызове функции не является оператором последовательного вычисления и не предоставляет таких гарантий). Дополнительные сведения см. в статье Точки следования C. Логические операторы также гарантируют вычисление своих операндов слева направо. Однако они вычисляют наименьшее количество операндов, необходимое для определения результата выражения. Это называется «сокращенным вычислением». Таким образом, некоторые операнды в выражении могут не вычисляться. Например, в выражении: второй операнд, y++ , вычисляется, только если x имеет значение true (не равно нулю). Таким образом, если y дает значение false (0), то x не увеличивается. ПримерыНиже приводится несколько примеров автоматической привязки выражений компилятором:
105 Операторы управления программой В первом выражении оператор побитового И ( b формирует первый операнд операции логического ИЛИ. Во втором выражении оператор логического ИЛИ ( || ) имеет более высокий приоритет, чем оператор простого присваивания ( = ), поэтому b || c группируется как правый операнд присваивания. Обратите внимание, что операнду a присваивается значение 0 или 1. В третьем примере приводится правильно сформированное выражение, которое может дать непредвиденный результат. Оператор логического И ( ) имеет более высокий приоритет, чем оператор логического ИЛИ ( || ), поэтому q r становится одним операндом. Так как логические операторы гарантируют вычисление операндов слева направо, то операция q r вычисляется раньше, чем s— . Но если выражение q r имеет ненулевое значение, то s— не вычисляется и s не уменьшается. Если то, что значение s не будет уменьшено, может вызвать проблемы в вашей программе, вы можете либо поставить s— первым операндом в выражении, либо выполнить декремент s в отдельной операции. Следующее выражение недопустимо и приводит к созданию диагностического сообщения во время компиляции.
В этом выражении оператор равенства ( == ) имеет наибольший приоритет, поэтому выражение p == 0 становится одним операндом. Далее по приоритету следует оператор условного выражения ( ? : ). Его первым операндом является p == 0 , а вторым — p += 1 . Однако последним операндом оператора условного выражения считается не p , а p += 2 , поскольку в этом случае p имеет более тесную привязку к оператору условного выражения, чем к оператору составного присваивания. Синтаксическая ошибка возникает потому, что операция += 2 не имеет левого операнда. Для того чтобы избежать ошибок такого рода и сделать код более читаемым, необходимо использовать скобки. Так, предыдущий пример можно исправить при помощи круглых скобок, как показано ниже: ( p == 0 ) ? ( p += 1 ) : ( p += 2 ) Источник: learn.microsoft.com Операторы языка c#Программа на языке С# состоит из последовательности операторов, каждый из которых определяет законченное описание некоторого действия и заканчивается точкой с запятой. Все операторы можно разделить на 4 группы: операторы следования, операторы ветвления, операторы цикла и операторы передачи управления. Операторы следованияОператоры следования выполняются компилятором в естественном порядке: начиная с первого до последнего. К операторам следования относятся: выражение и составной оператор. Любое выражение, завершающееся точкой с запятой, рассматривается как оператор, выполнение которого заключается в вычислении значения выражения или выполнении законченного действия, например, вызова метода. Например: ++i; //оператор инкремента x+=y; //оператор сложение с присваиванием Console.WriteLine(x); //вызов метода x=Math.Pow(a,b)+a*b; //вычисление сложного выражения Частным случаем оператора выражения является пустой оператор ; Он используется тогда, когда по синтаксису оператор требуется, а по смыслу — нет. В этом случае лишний символ ; является пустым оператором и вполне допустим, хотя и не всегда безопасен. Например, случайный символ ; после условия оператора while или if может совершенно поменять работу этого оператора. Составной оператор или блок представляет собой последовательность операторов, заключенных в фигурные скобки <>. Блок обладает собственной областью видимости: объявленные внутри блока имена доступны только внутри данного блока или блоков, вложенных в него. Составные операторы применяются в случае, когда правила языка предусматривают наличие только одного оператора, а логика программы требует нескольких операторов. Например, тело цикла while должно состоять только из одного оператора. Если заключить несколько операторов в фигурные скобки, то получится блок, который будет рассматриваться компилятором как единый оператор. Операторы ветвленияОператоры ветвления позволяют изменить порядок выполнения операторов в программе. К операторам ветвления относятся условный оператор if и оператор выбора switch. Условный оператор if Условный оператор if используется для разветвления процесса обработки данных на два направления. Он может иметь одну из форм: сокращенную или полную. Форма сокращенного оператора if: где В – логическое или арифметическое выражение, истинность которого проверяется; S – оператор: простой или составной. При выполнении сокращенной формы оператора if сначала вычисляется выражение B, затем проводится анализ его результата: если B истинно, то выполняется оператор S; если B ложно, то оператор S пропускается. Таким образом, с помощью сокращенной формы оператора if можно либо выполнить оператор S, либо пропустить его. Форма полного оператора if: if (B) S1; else S2; где B – логическое или арифметическое выражение, истинность которого проверяется; S1, S2- оператор: простой или составной. При выполнении полной формы оператора if сначала вычисляется выражение B, затем анализируется его результат: если B истинно, то выполняется оператор S1, а оператор S2 пропускается; если B ложно, то выполняется оператор S2, а S1 – пропускается. Таким образом, с помощью полной формы оператора if можно выбрать одно из двух альтернативных действий процесса обработки данных. Рассмотрим несколько примеров записи условного оператора if: if (a > 0) x=y; // Сокращенная форма c простым оператором if (++i) // Сокращенная форма c составным оператором if (i+j-1) < x= 0; y= 1;>else // Полная форма с составными операторами Рассмотрим пример использования условного оператора. static void Main() float x = float.Parse(Console.ReadLine()); Console.Write(«y min min /html/2706/280/html_bproe6eInr.piNm/img-urcNxR.png» name=»Image1″ align=»bottom» width=»114″ height=»98″ border=»0″> Подсчитать количество очков после выстрела по данной мишени. static void Main() float x = float.Parse(Console.ReadLine()); float y = float.Parse(Console.ReadLine()); Результат работы программы: x y Ball Задание. Измените программу так, чтобы подсчитывалось количество очков для мишени вида Оператор выбора switch Оператор выбора switch предназначен для разветвления процесса вычислений по нескольким направлениям. Формат оператора: Замечание. Выражение, записанное в квадратных скобках, является необязательным элементом в операторе switch. Если оно отсутствует, то может отсутствовать и оператор перехода. Выражение, стоящее за ключевым словом switch, должно иметь арифметический, символьный, строковый тип или тип указатель. Все константные выражения должны иметь разные значения, но их тип должен совпадать с типом выражения, стоящим после switch или приводиться к нему. Ключевое слово case и расположенное после него константное выражение называют также меткой case. Выполнение оператора начинается с вычисления выражения, расположенного за ключевым словом switch. Полученный результат сравнивается с меткой case. Если результат выражения соответствует метке case, то выполняется оператор, стоящий после этой метки, за которым обязательно должен следовать оператор перехода: break, goto и т.д. При использовании оператора break происходит выход из switch и управление передается оператору, следующему за switch. Если же используется оператор goto, то управление передается оператору, помеченному меткой, стоящей после goto. Пример. По заданному виду арифметической операции (сложение, вычитание, умножение и деление) и двум операндам, вывести на экран результат применения данной операции к операндам. static void Main() case ‘+’: res = a + b; break; //1 case ‘-‘: res = a — b; break; case ‘*’: res = a * b; break; res = (float)a / b; break; else goto default; default: ok = false; break; if (ok) Console.WriteLine(» = «, a, oper, b, res); Результат выполнения программы: oper x y rez 1. Замените в строке 1 оператор break, на оператор goto case ‘-‘ и посмотрите, что произойдет, если в качестве операции ввести +. 2. В условном операторе if уберите ветку else и посмотрите, что произойдет. Если необходимо, чтобы для разных меток выполнялось одно и тоже действие, то метки перечисляются через двоеточие. Например: case ‘+’: res = a + b; break; case ‘-‘: res = a — b; break; case ‘*’: res = a * b; break; case ‘/’: case ‘:’: if (b != 0) // перечисление меток res = (float)a / b; break; else goto default; default: ok = false; break; Источник: studfile.net Лекция. Лекция 3. Операторы языка C#Единственный в мире Музей Смайликов Самая яркая достопримечательность Крыма Скачать 339.25 Kb. Операторы языка C# Программа на языке C# состоит из последовательности операторов, каждый из которых определяет законченное описание некоторого действия и заканчивается точкой с запятой. Все операторы можно разделить на четыре группы: операторы следования, операторы ветвления, операторы цикла и операторы перехода. 3.1.Операторы следования Операторы следования выполняются в естественном порядке : начиная с первого до последнего. Любое выражение , завершающееся точкой с запятой , можно рассматривать как оператор следования. Например: ++i; //оператор инкремента x+=y; // оператор сложения с присваиванием Console.WriteLine(x); //вызов метода x= Math.Pow(a,b)+a*b; //вычисление сложного выражения Составной оператор или блок представляет собой последовательность операторов, заключенных в фигурные скобки <>. Блок обладает собственной областью видимости : объявленные внутри блока имена доступны только внутри данного блока или блоков, выраженных в него. Составные операторы применяются в случае , когда правила языка предусматривают наличие только одного оператора , а логика программы требует несколько операторов. Например , тело цикла whileдолжно состоять только из одного оператора. Если заключить несколько операторов в фигурные скобки , то получится блок, который будет рассматриваться компилятором как единый оператор. 3.2.Операторы ветвления Операторы ветвления позволяют изменить порядок выполнения операторов в программе. К операторам ветвления относятся условный оператор if и оператор выбора switch. Условный оператор if Условный оператор if используется для разветвления процесса обработки данных на два направления. Он может иметь одну из форм :сокращенную или полную. Форма сокращенного оператора if: где B-логическое выражение, истинность которого проверяется; S-оператор: простой или составной. При выполнении сокращенной формы оператора if сначала вычисляется выражение B , затем проводится анализ его результата: если B истинно, то выполняется оператор S; если B ложно, то оператор S пропускается. Таким образом , с помощью сокращенной формы оператора if можно либо выполнить оператор S , либо пропустить его. Форма полного оператора if: if (B) s1; else s2; где B- логическое выражение, истинность которого проверяется; S1,S2- оператор: простой или составной. При выполнении полной формы оператора if сначала вычисляется значение выражения B , затем анализируется его результат : если B истинно, то выполняется оператор S1 , а оператор S2 пропускается; если B ложно, то выполняется оператор S2 , а S1 –пропускается. Таким образом, с помощью полной формы оператора if можно выбрать одно из двух альтернативных действий процесса обработки данных. Рассмотрим несколько примеров записи условного оператора if: // Сокращенная форма с простым оператором //Сокращенная форма с составным оператором //Полная форма с простым оператором if (a>0|| b Пример 1 Замечание. Так как оператор if допускает наличие только одного оператора действий, то можно записать его без использования блока<> , например, так: Результат работы программы: Задания. 1.Объясните,почему в данном примере не требуется инициализация переменной max. 2.Измените программу так, чтобы вычислялось наименьшее значение из двух вещественных чисел. Замечание. Напомним, что вычислить максимум из двух чисел можно с помощью тернарной операции, а также с помощью метода Max из стандартной библиотеки C# Math, обратившись к данному методу следующим образом Math.Max(x,y). Пример 2. Найдем наибольшее значение из трех вещественных чисел: Static void Main() double x = double.Parse(Console.ReadLine()); double y = double.Parse(Console.ReadLine()); double z= double.Parse(Console.ReadLine()); Результат работы программы: 1. Измените программу так, чтобы вычислялось наименьшее значение из трех вещественных чисел. 2.Решите данную задачу, используя методы Math.Max(x,y)/Math.Min(x,y). Оператор выбора switch Оператор выбора switch предназначен для разветвления процесса вычислений по нескольким направлениям. Формат оператора: Замечание. Операторы, записанные в квадратных скобках, являются необязательными элементами в операторе switch. Если они отсутствуют, то могут отсутствовать и соответствующие им операторы перехода. Выражение, стоящее за ключевым словом switch, должно иметь арифметический, символьный, строковый тип или тип указатель. Все константные выражения должные иметь тип, соответствующий или допускающий неявное преобразование к типу выражения, стоящего внутри скобок switch. Ключевое слово case и расположенное после него константное выражение называют также меткой case. Выполнение оператора начинается с вычисления выражения, расположенного за ключевым словом switch. Полученный результат сравнивается с меткой case. Если результат выражения соответствует метке case, то выполняется оператор, стоящий после этой метки , за которым обязательно должен следовать оператор перехода :break, goto и т.д. В случае отсутствия оператора перехода компилятор выдаст сообщении об ошибке. При использовании оператора break происходит выход из switch и управление передает оператору , следующему за switch . Если же используется оператор goto, то управление передается оператору, помеченному меткой, стоящего после goto. Замечания. Оператор перехода goto лучше использовать для перехода по меткам внутри switch , и не использовать его для выхода из оператора switch. Для повышения производительности рекомендуется размещать ветви, вероятность выбора которых является наибольшей, ближе к началу. В этом случае на выбор требуемого варианта будет тратиться меньше времени. Пример. По заданному виду арифметической операции (сложение, вычитание, умножение и деление) и двум операндам вывести на экран результат применения данной операции к операндам. static void Main() char oper = char.Parse(Console.ReadLine()); double a= double.Parse(Console.ReadLine()); double b= double.Parse(Console.ReadLine()); Источник: topuch.com
Загрузка ...
|