Вызывает ли следующий код неопределенное поведение? - PullRequest
4 голосов
/ 27 февраля 2010
#include <iostream>
#include <cmath>

#define max(x,y) (x)>(y)? (x): (y)

int main() {
  int i = 10;
  int j = 5;
  int k = 0;
  k = max(i++,++j);
  std::cout << i << "\t" << j << "\t" << k << std::endl;
}

Ответы [ 2 ]

12 голосов
/ 27 февраля 2010

Нет, это не так.

В этом случае ситуация сохраняется благодаря тому факту, что оператор ?: имеет точку последовательности сразу после вычисления первого операнда (условия) и после этого только одно из двух выражений (второе или третий операнд). Ваш код эквивалентен

...
bool c = i++ > ++j;
k = c ? i++ : ++j;
...

Здесь нет неопределенного поведения.

4 голосов
/ 27 февраля 2010

Ну, конечно, с этим много проблем.

  • Макс на самом деле вычисляет мин
  • операторы приращения удваиваются при любом выборе, так как вы используете макрос
  • Использование постфиксных / префиксных приращений просто вводит в заблуждение, но не имеет большого отношения к проблеме.

Этот код будет выдавать одни и те же результаты при каждом запуске, поэтому нет, он не является неопределенным. У Кута:

i = 11
k = 7
j = 7

Звучит как проблема с домашним заданием. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...