
明白两点,问题就迎刃而解:
int型和char型是兼容的,即int型可以用%c输出,输出是字符;反过来char型可以用%d输出,输出是十进制整数。
浮点数没有被定义为无符号型,所以用unsigned修饰float型后实质是将变量声明成了int型。
根据以上两点,解释如下:
图1在正确输出i(A)并回车后,把j的4个字节拿出一个最低字节按字符输出,由于65的浮点尾数低字节是0,是%c的不可显示字节,所以只输出了个回车。接着按char型取出j的第二个字节(还是0)输出,结果同上。
图2的j和k交换位置后,前两个兼容都输出字符A,到最后一个j时才遇到上面刚才分析过的情况。
图3由于j成了无符号整数,所以输出都正确。
供参考。建议不弄这种题,由于输出格式化控制字符串与变量类型不匹配,本身就是错误的,不同的编译器很可能做出不同的处理,所以结果也可能会不同……
可以vsprintf()函数中的自变量是位于数组中的,数组元素的字符串之前都要加上百分号(%)。这个函数是“一步一步[step-by-step]”按顺序执行。在第一个%后,将插入第一个数组元素;在第二个%后,将插入第二个数组元素,依次类推。
vsprintf是sprintf的一个变形,它只有三个参数。vsprintf用于执行有多个参数的自订函式,类似printf格式。vsprintf的前两个参数与sprintf相同:一个用于保存结果的字元缓冲区和一个格式字串。第三个参数是指向格式化参数阵列的指标。实际上,该指标指向在堆叠中供函式呼叫的变数。va_list、va_start和va_end巨集(在STDARG.H中定义)帮助我们处理堆叠指标。本章最后的SCRNSIZE程式展示了使用这些巨集的方法。使用vsprintf函式,sprintf函式可以这样编写:
int sprintf (char * szBuffer, const
char * szFormat, ...){ int iReturn va_list pArgs va_start
(pArgs, szFormat) iReturn = vsprintf (szBuffer, szFormat, pArgs)
va_end (pArgs) return iReturn }
va_start巨集将pArg设置为指向一个堆叠变数,该变数位址在堆叠参数szFormat的上面。
函数名: vsprintf
功 能: 送格式化输出到串中
用 法: int vsprintf(char *string, char
*format, va_list param)
程序例:
#include
#include
#include
char buffer[80]
int vspf(char *fmt, ...)
{
va_list
argptr
int cnt
va_start(argptr, fmt)
cnt =
vsprintf(buffer, fmt, argptr)
va_end(argptr)
return(cnt)
}
int main(void)
{
int inumber
= 30
float
fnumber = 90.0
char
string[4] = "abc"
vspf("%d %f
%s", inumber, fnumber, string)
printf("%s\n", buffer)
return
0
}
va_list ap
int len
va_start(ap, format)
vsprintf(_this->printfBuf, format, ap)
va_end(ap)
把参数 ap 按照
format 指定的格式,
写到 _this->printfBuf
中
基本和 sprinf 类似 ......
比如上面给的例子:
vsprintf(buffer, fmt, argptr)
fmt="%d %f %s"
就是把后面的参数按照 "%d %f %s" 这个格式输出到 buffer中
缺少浮点型参数:如果写pair my(100.0, 75)就是默认浮点型。
使用浮点数进行比较,你应该设置一个目标精确度:比如小数点后3位,也就是精确度是:0.001,那么你在比较两个数时比较它们查的绝对值小于0.001就可以,即int型可以用%c输出,输出是字符;反过来char型可以用%d输出,输出是十进制整数。
浮点型函数实参:
函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf("%d",max(x,y))即是把max调用的返回值又作为printf函数的实参来使用的。
在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。介绍printf 函数时已提到过,这里从函数调用的角度再强调一下。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)