Какова связь между приоритетом оператора и порядок оценки? [дублировать]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Какова связь между приоритетом оператора и порядок оценки? [дублировать]

Сообщение Anonymous »

Термины «приоритет оператора» и «Порядок оценки» очень часто используются в программировании и чрезвычайно важны для того, чтобы программист мог знать. И, насколько я понимаю, две концепции тесно связаны; Один не может обойтись без другого при разговоре о выражениях. < /p>
давайте возьмем простой пример: < /p>

Код: Выделить всё

int a=1;  // Line 1
a = a++ + ++a;  // Line 2
printf("%d",a);  // Line 3
Теперь очевидно, что строка 2 приводит к неопределенному поведению, поскольку точки последовательности в C и C ++ включите:


[*] Между оценкой левого и правого операнда && (logical
и), || (логично или) и операторы запятой
. Например, в выражении
*p ++! = 0 && *q ++! = 0 < /code>, все
побочные эффекты субэкспрессии

Код: Выделить всё

*p++ != 0
завершены до любой попытки получить доступ к q .

между оценкой первого операнда тройного < BR /> «Вопросник» оператор и
второй или третий операнд. Например,
в выражении a = (*p ++)? ( *p ++): 0 < /code> Существует точка последовательности после
Первый *p ++ < /code>, что означает, что он уже
был увеличен к моменту того, как второй экземпляр
второй экземпляр выполнено. < /p>
< /li>
В конце полного выражения. Эта категория включает в себя операторы выражения
(например, назначение

Код: Выделить всё

a=b;< /code>), возвращаемые операторы,
управляющие выражениями if, переключатель,
while или do-while, и все
три выражения в операторе для A for. < /p>
< /li>
  до того, как функция введена в вызов функции. Порядок, в котором
оцениваются аргументы, не указан
, но эта точка последовательности
означает, что все их побочные эффекты
завершены до того, как функция введена
Полем В выражении f (i ++)+g (j ++)+h (k ++) < /code>,
f
вызывается с параметром
исходного значения i ,
, но i увеличивается, прежде чем вводить
тело f Полем Точно так же J и k
обновляются перед введением g и h
соответственно. Тем не менее, не указано
, в котором заказ f () , g () , h ()
выполняется, и в каком порядке I , j < /code>, увеличены. Значения j < /code> и в корпусе f , следовательно,
не определен. BR/> оператор запятой и порядок оценки
для , b и c is
unprecified.

При возврате функции после того, как возвращаемое значение копируется в контекст вызова
. (Эта точка последовательности
указана только в стандарте C ++;
присутствует только неявно в
. li> в конце инициализатора; Например, после оценки 5
в объявлении int a = 5; < /code>. < /p>
< /li>
< /ol>

< /blockquote>
Таким образом, по точке # 3: < /p>

в конце полного выражения. Эта категория включает в себя операторы выражения (например, назначение a = b;), операторы возврата, контролирующие выражения if, switch, while или do-wy-wyle, и все три выражения в операторе для.
< /blockquote> явно приводит к неопределенному поведению. Это показывает, как неопределенное поведение тесно связано с точками последовательности .
Теперь давайте возьмем другой пример:

Код: Выделить всё

int x=10,y=1,z=2; // Line 4
int result = x

Подробнее здесь: [url]https://stackoverflow.com/questions/5473107/what-is-the-relation-between-operator-precedence-and-order-of-evaluation[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»