我的任务是使用其大部分功能(在C中)重新编码printf。但是,在进行一些测试时,我发现了一个问题:当用户放置多于1个修饰符时,我不明白标准函数的行为(允许的修饰符是h,hh,l,ll,z和j)。 /> 例如:
printf("%hhld", 128) results in 128 printed out;
printf("%lhhd", 128) results in 128 printed out;
printf("%lhhd", 9223372036854775807) shows 9223372036854775807;
printf("%lhhd", 9223372036854775808) shows -9223372036854775808;
printf("%hhld", 9223372036854775807) shows 9223372036854775807;
printf("%hhld", 9223372036854775808) shows -9223372036854775808;
将选择什么修饰符以及printf如何选择它?为什么在这种情况下总会忽略......
另一个问题是我的printf是否应该以随机顺序使用flags和modifier?因为在wiki中,文章提到了某个顺序:
%[参数] [标志] [宽度] [。精度] [长度]类型
答案 0 :(得分:4)
这是未定义的行为,请阅读文档。
基本上传递一个参数,该参数的类型与说明符所期望的类型不同,被标准认为是未定义的行为。
您也在混合不兼容的说明符,再次“只阅读文档”,如果您想要完全理解printf(3)
的行为,这是一个很好的文档。