printf("%#.0o", 0); ambiguous?This issue has been automatically converted from the original issue lists and some formatting may not have been preserved.
Authors: Jutta Degener, DIN
Date: 1995-06-11
Submitted against: C90
Status: Closed
Converted from: dr.htm, dr_151.html
This Defect Report was prompted by articles posted to comp.std.c by Bakul Shah, Rex Jaeschke, and Soenke Behrens.
DIN-002:
The C Standard's specification of what
printf("%#.0o", 0);
outputs is ambiguous, and compiler vendors have indeed interpreted it differently.
For a zero integer value, the descriptions of the # flag and the 0 precision
in subclause 7.9.6.1 contradict each other.
The # demands that the first digit be zero;
# The result is to be converted to an "alternate form." For o conversion, it
increases the precision, if and only if necessary, to force the first digit of
the result to be a zero.
But a precision of 0 demands that nothing at all be printed.
o,u,x,X [...] The result of converting a zero value with a precision of zero
is no characters.
In the hexadecimal case, the description of the # flag's effects has been
worded such that the conflict is avoided:
# [...] For x (or X) conversion, a nonzero result will have 0x (or 0X)
prefixed to it.
If it was intended that the octal case, too, should print nothing, this crucial "nonzero" should be introduced into its description as well.
In subclause 7.9.6.1, replace:
For o conversion, it increases the precision, if and only if necessary, to
force the first digit of the result to be a zero.
by:
For o conversion, it increases the precision, if and only if necessary, to
force the first digit of a nonzero result to be a zero.
Comment from WG14 on 1997-09-23:
The C Standard is clear enough as is. The call
printf("%#.0o", 0)
should print 0.