Które liczby spowodowałyby awarię tej funkcji?


10

Które wartości xiy spowodują awarię niektórych kompilatorów C?

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

Ponieważ trójskładnikowe skróty operatora C, powiedziałbym, że nie. To pytanie nie pasuje do formatu tej witryny, która koncentruje się na zagadkach programowych i golfie kodowym. Zobacz często zadawane pytania na temat codegolf.stackexchange.com/faq .
Steven Rumbalski

To nie jest golf golfowy, ale łamigłówka. Jest odpowiedź, a to tylko kilka liczb.
ugoren,

Poprawiono mnie.
Steven Rumbalski

2
W rzeczywistości, sądząc po książce K&R, ta funkcja nigdy nie może ulec awarii. Jednak według standardu ANSI C zachowanie w konkretnym przypadku awarii jest niezdefiniowane, aw przypadku kompilatorów x86 ulega awarii.
ugoren,

1
@dmckee, Jeśli podasz prawidłową odpowiedź, jesteś zwycięzcą. Jaki krezion może być bardziej jasny i obiektywny? Jest tylko jedna odpowiedź (czy masz inny przykład?)
ugoren,

Odpowiedzi:


7

-2147483648 (INT_MIN) i -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: wyjątek zmiennoprzecinkowy ./a.out


W rzeczy samej. Chociaż powinno to dać ostrzeżenie, ponieważ 2147483648 nie jest prawidłową liczbą całkowitą.
ugoren,

1
Tak, dlatego użyłem INT_MIN później, aby użyć poprawnego int. Myślę, że powodem jest to, że 2147483648 nie jest poprawną wartością int, ponieważ INT_MAX to 2 ^ 31-1 z int 32-bitową.
eregon

Ach Uzupełnienie dwóch. Tęsknie za tym.
Steven Rumbalski

Tak, powinien skompilować się czysto z INT_MIN (czyli -2147483648).
ugoren,

3

Prawidłowa odpowiedź jest już podana, ale od razu pomyślałem o Microsoft Pex .

Pex automatycznie generuje pakiety testowe o wysokim pokryciu kodu. Bezpośrednio z edytora kodu Visual Studio, Pex znajduje interesujące wartości wejściowych i wyjściowych twoich metod, które możesz zapisać jako mały pakiet testowy z dużym pokryciem kodu. Microsoft Pex to dodatek Visual Studio do testowania aplikacji .NET Framework

Po dodaniu łamigłówki na stronie piaskownicy znajduje odpowiedź w ciągu kilku sekund, tak samo jak odpowiedź Eregons. (kliknij zapytaj pex)

Uwaga: robi to w C #, ale język nie jest tak naprawdę istotny.

  • x: int.MinValue
  • y: -1
  • Wyjątek: wyjątek przepełnienia
  • Komunikat: Operacja arytmetyczna spowodowała przepełnienie.

1
Miły. Z pewnością nie jest to brutalna siła, ponieważ nie skończyłoby się to za kilka sekund. Chyba ktoś ze stwardnienia rozsianego zdał sobie sprawę, że liczby około 0 i MAX_INT są zawsze interesujące.
ugoren

Mam nadzieję, że to trochę sprytniejsze. To może wyglądać na (x/y)i wiedzieć, że INT_MIN, -1, 0itd. Są wszystkie przypadki problem dla tego wyrażenia, i starają się odwrócić inżynier sposób wytwarzania tych wartości w czasie oceny.
Nieświadomy
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.