#include<stdio.h>
main()
{
unsigned int num;
printf("enter the number:\n");
scanf("%u",&num);//4294967299 if i'm scanning more than 4G its not scanning
printf("after scanning num=%u\n",num);// 4294967295 why its giving same 4G
/* unsigned char ch;
printf("enter the character:\n");
scanf("%d",&ch);// if i/p=257 so its follow circulation
printf("after scanning ch=%d\n",ch);// 1 its okk why not in int ..
*/
}
Run Code Online (Sandbox Code Playgroud)
为什么在扫描输入时循环没有跟随scanf(),为什么它会跟随char?
C11标准草案n1570 7.21.6.2说明如下
[...]输入项[...]转换为适合转换说明符的类型.如果输入项不是匹配序列,则指令的执行失败:此条件是匹配失败.除非由a指示赋值抑制,否则
*转换的结果将放在由尚未收到转换结果的format参数后面的第一个参数指向的对象中.如果此对象没有适当的类型,或者无法在对象中表示转换结果,则行为未定义.
现在,这里的"转换"一词用于string =>结果数据类型转换,它不能理解为整数转换.由于"4294967299"转换为十进制整数的字符串在unsigned int32位宽的类型的对象中无法表示,因此标准的读取表明行为未定义,即
使用不可移植或错误的程序结构或错误数据时的行为,本国际标准不对此要求
因此,您的问题的答案是C标准没有说明这种情况下的行为,您看到的行为是您的编译器和C库实现所展示的行为,并且不可移植; 在其他平台上,可能的行为可能包括:
完全忽略这种情况,结果不可预测,在翻译或程序执行过程中以环境特征(有或没有发出诊断信息)的特定文件表现,终止翻译或执行(发布诊断信息) .