2011-09-20 42 views
0

我有这样的片段:分配处理的值不同

#include <stdio.h> 
#include<conio.h> 

void main() { 
    int x = 10/0; 
    printf("%d", x); 
    getch(); 
} 

上述输出是10

但是,如果我运行此:

#include<stdio.h> 
#include<conio.h> 

void main() { 
    int x = 10/2; 
    printf("%d", x); 
    getch(); 
} 

输出是5。 为什么?

我使用TurboC++编译器Windows 7使用DosBox

而且,如果我做这样的:

#include<stdio.h> 
#include<conio.h> 
void main(){ 
    int x=10; 
    x=x/0; //now it would not compile and gives error 
} 
+0

你使用什么编译器(和什么版本)? – orlp

+4

惊讶第一个没有抛出一个div异常 – Nick

+0

你的第一个代码清单给了我一个'浮点异常',见下面的锐利齿轮答案。 – brc

回答

4

10/0印刷品10

除零是Undefined Behaviour(*)。任何事情都可能发生。如果你幸运的话,电脑会打印一些非常意想不到的事情,迫使你纠正编程错误;如果你不走运,很长一段时间这个错误会被忽视。

10/2印刷5

这是正确的。 10除以25

(*)的C99 Standard说:

6.5.5/5
...
...如果第二个操作数的值为零,则行为是不确定的。

2

由于基本的算术10/2=5

+0

+1让我大笑 –

+0

@bitmap:10/0 =?' –

+0

@Mohammad Faisal @将数字除以零是毫无意义的,在你的情况下,一些编译器会抱怨,其他人会忽略这个基本错误惩罚。 – Bitmap

3

除以零是未定义的行为,所以任何结果都是允许的 - 它可能会崩溃或编译器可能拒绝编译该代码(Visual C++ 10这样做)。将10除以5得到2就像您通常所期望的那样。

+0

拒绝编译是无效的行为,除非编译器可以证明总是对表达式进行评估。例如,'1?1:1/0'完全有效。也许更有趣的是if(first_counterexample_to_riemann_hypothesis())1/0;' –