哪个数字将导致该功能崩溃?


10

x和y的哪个值会导致某些C编译器崩溃?

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

由于C是三元运算符的捷径,所以我不会说。这个问题似乎与该网站的格式不符,该网站侧重于程序难题和代码高尔夫球。有关详细信息,请参见常见问题解答codegolf.stackexchange.com/faq
史蒂芬·鲁姆巴尔斯基

这不是高尔夫的代码,而是一个难题。有一个答案,只有几个数字。
ugoren

我站得住了。
史蒂芬·鲁姆巴尔斯基

2
实际上,从K&R的书来看,此功能绝对不能崩溃。但是根据ANSI C标准,在特定崩溃情况下的行为是不确定的,并且对于x86编译器,它会崩溃。
ugoren 2012年

1
@dmckee,如果您给出正确的答案,那您就是赢家。哪种选择更清楚,更客观?只有一个答案(或者您有另一个例子吗?)
ugoren 2012年

Answers:


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 2012年

1
是的,这就是为什么我之后使用INT_MIN来使用有效的int的原因。我想原因是2147483648不是有效的整数,因为INT_MAX是32位整数的2 ^ 31-1。
俄勒冈州2012年

啊。补码。我错过了。
Steven Rumbalski 2012年

是的,它应该使用INT_MIN(-2147483648)进行干净地编译。
ugoren 2012年

3

已经给出了正确的答案,但是我立即想到了Microsoft Pex

Pex自动生成具有高代码覆盖率的测试套件。Pex可以从Visual Studio代码编辑器中找到方法的有趣的输入输出值,您可以将其保存为具有高代码覆盖率的小型测试套件。Microsoft Pex是用于测试.NET Framework应用程序的Visual Studio加载项

在沙盒站点中添加拼图后,它会在几秒钟内找到答案,与标准答案相同。(点击询问pex)

注意:它是用C#编写的,但该语言并不真正相关。

  • x:int.MinValue
  • y:-1
  • 异常:OverflowException
  • 消息:算术运算导致溢出。

1
真好 它肯定不会强行使用它,因为它不会在几秒钟内结束。我猜想MS中有人意识到0和MAX_INT左右的数字总是很有趣。
ugoren 2012年

希望它比这更聪明。它可能会看着(x/y),知道INT_MIN-10等都是问题的情况下该表达式,并尝试逆向工程的方式在评估的时间来产生这些值。
笨拙的2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.