2015-02-09 2 views
-2

В конце концов, мы обычно должны указать, что возвращает функция; то есть, если мы вернем значение из функции, мы всегда даем обещание относительно возвращаемого значения (как еще бы вызывающий, чего ожидать).Предварительные условия и пост-состояние в C++

int area(int lenght, int width) 
// pre-conditions : lenght and width are positive 
// post-condition : returns a positive value that is the area 
{ 
if (lenght <= 0 || width <= 0) error("area() pre-condition"); 
int a = lenght * width; 
if (a <= 0) error("area() post-condition"); 
return a; 

} 

Это простой пример использования предварительных условий и пост-состояние, но то, что я не могу понять, что автор говорит, после того, как показывает пример:

«Мы не могли проверить полное пост-условие, но мы проверили часть, в которой говорилось, что она должна быть положительной ».

Что это значит? Почему мы не смогли проверить полное пост-состояние? В моем понимании в этом случае как постусловие нам просто нужно проверить, что переменная a положительна, я ошибаюсь?

Чем автор задать мне этот вопрос:

Найти пару значения, так что предварительное условие этой версии области имеет, но пост-условие не делает.

Разве это невозможно?

+2

Невозможно с математической точки зрения, возможно, но C++ далека от математической. – chris

+1

Недопустимое условие/Действительное условие: -1 * -1 = .1 Допустимое условие/Недействительное (неопределенное) Постусловие 2 * INT_MAX =? –

ответ

2

В моем понимании в этом случае в качестве пост-состояния нам просто нужно проверить, что переменная a положительна, не так ли?

Да. Обратите внимание на полный пост-состояние ...

возвращает положительное значение , что является областью

Можно передавать значения из length и width таким образом, что a не выходит на правильный из-за переполнения.

1

Почему мы не смогли проверить полное состояние послесловия?

Поскольку часть пост-состояния является «это область». Мы этого не проверяли; и нетрудно проверить, что результат умножения равен математически ожидаемому значению.

Разве это невозможно?

Если умножение переполняется, давая неопределенное поведение, то вы можете получить отрицательный результат от двух положительных входов.

0

Ваш пример, безусловно, касается подписанного арифметического переполнения в lenght * width.

В этом случае это очень плохая иллюстрация понятия пост-состояния.Ожидание, которое должно быть указано для объяснения предварительных условий:

  • Если функция вызывается с аргументами, которые удовлетворяют предварительному условию, то она не вызывает неопределенное поведение.
  • Если функция вызывается с аргументами, которые удовлетворяют предусловию, то пост-условие выполняется, когда функция завершается.

Пример в вашем вопросе иллюстрирует первое, а не второе.

Автор считает, что функция возвращает отрицательную «область» для некоторого ввода, но автор ошибается: функция может возвращать только правильный результат (положительное значение, которое является правильной областью) или вызывать неопределенное поведение. То, что это неопределенное поведение может привести к ошибке a, оказывающейся отрицательной на некоторых платформах компиляции, не имеет значения. Неопределенное поведение запрещено. Неопределенное поведение непредсказуемо.

Смежные вопросы