问题描述
在许多网站(例如:GeeksForGeeks: Difference between %d and %i format specifier in C language或TutorialsPoint: Difference between %d and %i format specifier in C)中,他们说:
在scanf
中;
%d
将整数值用作带符号的十进制整数,并且
%i
将整数值作为具有十进制,十六进制或八进制类型的整数值。
仅对%d
而不是%i
使用“签名”一词
我希望%i
仅接受无符号值
但
%i
可以很好地处理负数。
那么,%i
没人提到“签名”一词又是什么呢?
解决方法
仅对%d而不是对%i使用“签名”一词,我希望%i 仅接受无符号值,但%i可以很好地使用负数 数字。那么%i的原因是没有人提到“签名”一词 为此吗?
我不会说“没人”。语言标准针对%d
说:
匹配一个可选的带符号十进制整数。 [...]相应的参数应为指向有符号整数的指针。
和%i
:
匹配一个可选的带符号整数。 [...]相应的参数应为指向有符号整数的指针。
输入表示形式和相应指针参数的目标符号周围的语言对于这两者是相同的。
我只能推测为什么任何网页作者以比您所希望的或标准的清晰度和准确性低的方式描述%i
的含义。对于十六进制格式的%x
需要一个指向无符号整数的指针这一事实可能使某些人感到困惑。也许有些草率。也许有些人懒惰地依赖其他网页的不精确语言,而不是主要来源。
“整数值,是带有十进制,十六进制或八进制类型的整数值。” ->不,不是 type ,而是带有十进制,八进制或十六进制的文本前缀。
"%i"
的匹配类型仍然是指向int
的指针。
它允许“ 0x123”,而"%d"
仅看到0并停在x
。