简体   繁体   中英

Why the output of printf(“%d”,1/0.0) is 0?

I use the codeblock .

When the code is:

printf("%d",1/0);

The program can not run, there is an error. But when I write this:

printf("%d",1/0.0);

The program can run,and the output is 0 . I want to know why.

1/0 or 1/0.0 are both undefined behavior:

C11 §6.5.5 Multiplicative operators

The result of the / operator is the quotient from the division of the first operand by the second; the result of the % operator is the remainder. In both operations, if the value of the second operand is zero, the behavior is undefined.

You are invoking undefined behavior of two different forms one by dividing by zero, the draft standard section 6.5.5 Multiplicative operators paragraph 5 says ( emphasis mine ):

The result of the / operator is the quotient from the division of the first operand by the second; the result of the % operator is the remainder. In both operations, if the value of the second operand is zero, the behavior is undefined .

The second by using the wrong format specifier in printf, you should be using %f since the result of 1/0.0 is a double not an int . The C99 draft standard section 7.19.6.1 The fprintf function which also covers pritnf in paragraph 9 says:

If a conversion specification is invalid, the behavior is undefined.248) If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

Although if the implementation supports IEEE 754 floating point division by zero should result in either +/- inf . and 0/0.0 will produce a NaN . Important to note that relying on __STDC_IEC_559__ being defined may not work as I note in this comment .

In theory, the result of 1/0.0 may be undefined in a C implementation, since it is undefined by the C standard. However, in the C implementation you use, the result is likely infinity. This is because most common C implementations use (largely) IEEE 754 for floating-point operations.

In this case, the cause of the output you see is that 1/0.0 has double type, but you are printing it with %d , which requires int type. You should print it with a specifier that accepts the double type, such as %g .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM