Какие числа могут привести к сбою этой функции?


10

Какие значения x и y вызовут сбой некоторых компиляторов Си?

int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}

Поскольку ярлыки троичного оператора C, я бы сказал, никто не будет. Этот вопрос, кажется, не подходит для формата этого сайта, который сосредоточен на программных головоломках и коде гольфа. Смотрите FAQ для подробной информации codegolf.stackexchange.com/faq .
Стивен Румбальски

Это не код гольф, а головоломка. Ответ есть, и это всего лишь пара цифр.
Угорен

Я стою исправлено.
Стивен Румбальски

2
На самом деле, судя по книге K & R, эта функция действительно никогда не должна сбоить. Но по стандарту ANSI C поведение в конкретном случае сбоя не определено, а с компиляторами x86 происходит сбой.
Угорен

1
@dmckee, если ты дашь правильный ответ, ты победитель. Какой cretirion может быть более ясным и объективным? Там только один ответ (или у вас есть другой пример?)
Угорен

Ответы:


7

-2147483648 (INT_MIN) и -1

#include <stdio.h>
#include <limits.h>
int f(int x, int y) {
    return (y==0) ? 0 : (x/y);
}
int main() {
    int r = f(INT_MIN, -1);
    printf("%d\n", r);
    return 0;
}

$ gcc -Wall Division.c && ./a.out # => zsh: исключение с плавающей запятой ./a.out


Верно. Хотя это должно дать предупреждение, потому что 2147483648 не является допустимым целым числом.
Угорен

1
Да, именно поэтому я использовал INT_MIN после, чтобы использовать действительный int. Я думаю, причина в том, что 2147483648 не является допустимым int, поскольку INT_MAX равен 2 ^ 31-1 с 32-битным int.
Эрегон

Ах. Два дополнения. Я пропустил это.
Стивен Румбальски

Да, он должен компилироваться чисто с INT_MIN (который -2147483648).
Угорен

3

Правильный ответ уже дан, но я сразу подумал о Microsoft Pex .

Pex автоматически генерирует тестовые наборы с высоким охватом кода. Прямо из редактора кода Visual Studio Pex находит интересные значения ввода-вывода ваших методов, которые вы можете сохранить в виде небольшого набора тестов с высоким охватом кода. Microsoft Pex - это надстройка для Visual Studio для тестирования приложений .NET Framework

После добавления вашей головоломки в сайт с песочницей, он находит ответ через несколько секунд, так же, как и ответ eregons. (нажмите спросить Pex)

Примечание: он делает это в C #, но язык не очень актуален.

  • x: int.MinValue
  • у: -1
  • Исключение: OverflowException
  • Сообщение: арифметическая операция вызвала переполнение.

1
Ницца. Это, конечно, не грубая сила, потому что это не закончится через несколько секунд. Я предполагаю, что кто-то в MS понял, что числа около 0 и MAX_INT всегда интересны.
Угорен

Надеюсь, это немного умнее, чем это. Он может смотреть на (x/y)и знать , что INT_MIN, -1, и 0т.д., все проблемные случаи для этого выражения, и попытаться перепроектировать способ получения этих значений в момент оценки.
невежественный
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.