The author takes a quirk of no consequence in the C grammar and elevates it excessively.
The distinction between decimal constants and other constants the author discusses exists only in parsing the grammar of the C language. In regard to 0, it has no effect on actual language semantics.
In C 2024 6.4.5.2, the C grammar classifies an integer-constant as a decimal-constant, an octal-constant, a hexadecimal-constant, or a binary-constant (which is new). They may also have an integer-suffix, like l or u, not discussed here. 123 is a decimal constant, 0123 is an octal constant, 0x123 is a hexadecimal constant, and 0b101 is a binary constant.
These constants are classified by their initial characters. 0x or 0X indicates a hexadecimal constant, 0b or 0B indicates a binary constant, 0 without b, B, x, or X indicates an octal constant, and the lack of any of these indicates a decimal constant. Because of this, the constant 0 is parsed as an octal constant. The result is an int with value zero. However, supposed we changed the grammar to make 0 a special case, that it were parsed as a decimal constant. The result would be an int of value zero. There would be no observable difference in how any C program were interpreted or executed.
The distinction exists solely as a description of the C grammar and has no effect on C semantics.
The quirk exists merely because it is easier to say “If an integer constant starts with 0, it is octal (or hexadecimal or binary)” than to say “If an integer constant starts with 0, it is octal (or hexadecimal or binary) except if it is just 0, then it is decimal.”
I will note that the distinction between octal and decimal can have a real effect on other values. The type of an integer constant is affected by whether an integer-constant is decimal or other, but only if its value is large. C 2024 Table 2.4 lists the types that are used. If an unsuffixed decimal constant is too large for an int, the next type considered for it is long int, whereas, for an unsuffixed octal constant, the next type is unsigned int. However, for 0, the value always fits, so this difference is inapplicable for it.
Floating-point constants have a similar classification; a floating-constant in the grammar is either a decimal-floating-constant or a hexadecimal-floating-constant (which begins with 0x or 0X). Again, this distinction exists solely in the grammar and has no effect beyond it. Both 0. and 0x0p0 yield a double with value zero.
0and1are not specifically decimal values. They have the same value in any number base.IntegerLiteral : DecimalIntegerLiteral, and it says 'An integer literal may be expressed in decimal' (Java Language Specification #3.10.1 Integer Literals). So the author of your book is quite incorrect.0123are explicitly octal and it's a common beginner mistake to write them like that, thinking they just added some zero padding for formatting purposes.