Які цифри можуть зірвати цю функцію?


10

Які значення x і y спричинить збій з деякими компіляторами C?

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

Оскільки ярлики потрійних операторів С, я б сказав, що жоден не зробив би. Це питання, схоже, не відповідає формату цього веб-сайту, орієнтованому на головоломки програми та гольф коду. Докладні відомості дивіться у файлі codegolf.stackexchange.com/faq .
Стівен Румбальський

Це не код гольфу, а головоломка. Є відповідь, і це всього лише пара номерів.
ugoren

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

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

1
@dmckee. Якщо ви дасте правильну відповідь, ви переможете. Який кретіріон може бути більш чітким та об'єктивним? Є лише одна відповідь (чи є у вас інший приклад?)
ugoren

Відповіді:


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 не є дійсним цілим числом.
ugoren

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

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

Так, він повинен чітко збиратися з INT_MIN (що становить -2147483648).
ugoren

3

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

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

Після додавання головоломки на пісочному майданчику він через кілька секунд знаходить відповідь, такий самий, як відповідь ерегонів. (натиснути запитувати pex)

Примітка: це робиться в C #, але мова не дуже актуальна.

  • x: int.MinValue
  • у: -1
  • Виняток: OverflowException
  • Повідомлення: Арифметична операція призвела до переповнення.

1
Приємно. Це, звичайно, не жорстоко змушує, тому що це не закінчиться за кілька секунд. Я думаю, хтось із MS зрозумів, що цифри навколо 0 та MAX_INT завжди цікаві.
ugoren

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