Hangi Sayılar Bu İşlevi Çöktürür?


10

Hangi x ve y değerleri bazı C derleyicilerinde kilitlenmeye neden olur?

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

C'nin üçlü operatör kısayolları olduğundan, hiçbirinin yapamayacağını söyleyebilirim. Bu soru, program bulmacaları ve kod golfüne odaklanan bu site için biçime uymuyor gibi görünüyor. Ayrıntılar için bkz. SSS codegolf.stackexchange.com/faq .
Steven Rumbalski

Bu kod golf değil, bir bilmecedir. Bir cevap var ve bu sadece birkaç sayı.
ugoren

Ben düzeltilmiş duruyorum.
Steven Rumbalski

2
Aslında, K&R kitabına göre, bu işlev gerçekten asla çökmemelidir. Ancak ANSI C standardına göre, belirli kilitlenme durumundaki davranış tanımlanmamıştır ve x86 derleyicileri ile çöküyor.
ugoren

1
@dmckee, Doğru cevabı verirseniz kazanan siz olursunuz. Hangi kret daha net ve objektif olabilir? Sadece bir cevap var (ya da başka bir örneğin var mı?)
ugoren

Yanıtlar:


7

-2147483648 (INT_MIN) ve -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 -Duvar bölmesi.c && ./a.out # => zsh: kayan nokta istisnası ./a.out


Aslında. Bu bir uyarı vermesine rağmen, 2147483648 geçerli bir tamsayı değil.
ugoren

1
Evet, bu yüzden geçerli bir int kullanmak için INT_MIN kullandım. Sanırım nedeni 2147483648 geçerli bir int değil, çünkü INT_MAX 32-bit int ile 2 ^ 31-1.
eregon

Ah. Ikisinin tamamlayıcısı. Onu özledim.
Steven Rumbalski

Evet, INT_MIN (-2147483648) ile temiz bir şekilde derlenmelidir.
ugoren

3

Doğru cevap zaten verildi, ancak hemen Microsoft Pex'i düşündüm .

Pex otomatik olarak yüksek kod kapsamına sahip test paketleri üretir. Doğrudan Visual Studio kod düzenleyicisinden Pex, yöntemlerinizin ilginç giriş-çıkış değerlerini bulur ve yüksek kod kapsamına sahip küçük bir test paketi olarak kaydedebilirsiniz. Microsoft Pex, .NET Framework uygulamalarını sınamak için bir Visual Studio eklentisidir

Sonra bulmaca ekleyerek sandbox sitedeki, birkaç saniye içinde cevap, eregons cevap olarak aynı bulur. (pex'e sor)

Not: C # ile yapar, ancak dil gerçekten alakalı değildir.

  • x: int.MinValue
  • y: -1
  • İstisna: OverflowException
  • İleti: Aritmetik işlem bir taşmaya neden oldu.

1
Güzel. Kesinlikle kaba kuvvet uygulamaz, çünkü birkaç saniye içinde bitmez. Sanırım MS'deki birisi 0 ve MAX_INT civarındaki sayıların her zaman ilginç olduğunu fark etti.
ugoren

Umarım bundan biraz daha zekidir. Hiç de görünebilir (x/y)ve biliyoruz INT_MIN, -1, 0vb o ifadesi için tüm sorun durumlardır ve değerlendirilmesi sırasında bu değerleri üretmek için bir yol tersine mühendislik deneyin.
Clueless
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.