好了 , 又到了今天的学习时间。
上一期说了转换声明的使用,这一期的开始先说一说转换声明的意义。
转换声明把以二进制格式储存在计算机的值转换成一系列字符(字符串)以便于显示。例如,数字76,在计算机中的储存格式是二进制数01001100。%d转换说明将其转换成字符7和6,并显示76;%x转换说明将其转换成十六进制数4c;%c转换说明将其转换成字符L。
这里说到了二进制,十六进制,还有一个八进制,都是计算机中常用的,今天在发出这篇文章的同时,还会再发一集进制数转换的专题篇,这里就不多赘述了。
【注1】:转换不匹配
转换说明应该与待打印值相匹配,转换说明通常有多种选择,例如:int类型的值可用%d %x %o他们的区别在于表示的值的形式不同;同样,double也可以用%e %f %g。如果转换说明与待打印值不相匹配会怎么样呢?
来看一个例子intconv.c程序如下
#include <stdio.h>
#define PAGES 666
#define WORDS 66666
int main(void)
{
short num = PAGES;
short mnum = -PAGES;
printf("num as short and unsigned short: %hd %hu\n",num,num);
printf("-num as short and unsigned short: %hd %hu\n",mnum,mnum);
printf("num as int and char :%d %c\n",num,num);
printf("WORDS as int ,short ,and char : %d %hd %c\n",WORDS,WORDS,WORDS);
return 0;
}
输出结果:
num as short and unsigned short: 666 666
-num as short and unsigned short: -666 64870
num as int and char :666 ?
WORDS as int ,short ,and char : 66666 1130 j
可以见得,当二者不匹配时,就会得不到想要的值 。所以一定要想清楚对应的关系,以避免这样的输出错误,具体的对应表格在前几期都陆续给出了,大家可以多多回顾,顺便点一波关注。
以上体现的都是参数传递的问题。
参数传递机制因实现而异,下面我们来分析一下参数传递的原理:
如printf("%ld %ld %ld %ld\n",n1,n2,n3,n4);
该调用告诉计算机把变量n1,n2,n3和n4的值传递给程序,这是一种常见的传递方式。程序把传入的值放入被称为栈的内存区域。计算机根据变量类型(不是根据转换说明)把这些值放入栈中。然后,控制转到printf()函数中,该函数根据转换说明(不是变量类型)从栈中读取值。
【注2】printf()的返回值
大部分C函数都有一个返回值,这是函数计算并返回给主函数的值。
例如,C库包含一个sqrt()函数,接受一个数作为参数,并返回该数的平方根。可以把返回值赋给变量,也可以用于变量,还可以用于参数传递。总之,可以把返回值当作其他值一样使用。而printf()的返回值是它打印的字符的个数,但如果输入错误printf()的返回值就是一个负数。
【注3】打印较长字符
有时,printf()语句太长,在屏幕上不方便阅读。因此一条语句可以写成多行,只需要在不同部分输入空白即可。