
应该先翻书~~
i=8;
++i; 自身+1,
i++; 这语句执行完后,自身+1
编译器一般是倒这把参数压入栈 (为了出栈时先取到第一个参数), 所以执行顺序是倒着的
1 -i-- 表达式值为-8 i值为8(由于i--,是要在语句执行完后才-1,因此i仍然是8) (不能保证其他编译器是否也是这样的,可能i变为7,所以后面结果都会不一样)
2 -i++ 表达式值为-8 i值为8
3 i-- 表达式值为8 i值为8
4 i++ 表达式值为8 i值为8
5 --i 表达式值为7 i值为7
6 ++i 表达式值为8 i值为8
那么输出就是 8 7 8 8 -8 -8
这题目答案未必是唯一的,不同的编译器结果会不一样 以上是VC输出的结果
printf就是格式化输出。
比如说printf("10000");(注意双引号) 就会在屏幕上显示出 1000
但是,想要输出变量的值,就要用在“%”后面加上几个字母,在后面的位置对应。其他一切正常。
如 int i=1;printf("%d",i);就输出了i的值:1
int i=1;j=2; printf("%d %d",i,j);就输出了:1 2
int 用 %d 输出
float 用 %f 输出
long 用 %ld 输出
double 用 %lf 输出
char 用 %c 输出。
先用16进制接收试试,看看接收的内容有没有61,如果有的话就是你上位机的事儿。
首先你printf打印的是ascii码,每个字符占1字节 ,8位。而接收区通常需要显示中文,中文是UNICODE,是16位,两字节。所以在接收到以后,它会先把两个ASCII码读成一个UNICODE,而后再分开来为两个UNICODE,但你发出的程序是9字节,不是偶数,串口助手如果有BUG的话,就不能完全显示 。所以你再加上一个字母试试。
在keil中使用printf()函数的要点
在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下:
1printf函数是调用putchar函数输入的,而putchar应该是先判断ti是否为1,不为1则等待为1。如果为1则清0,然后送出一 个字符。因此你如果直接使用printf函数,你的程序就会在putchar函数中等待ti为1。这时你的程序就相当于直接死掉了。你可以通过改写 putchar函数实现自己的目的的。
2Keil的串口处理比较巧妙的,我的分析如下:
putcharc里面,是先检测TI再发送。这样做的目的是把尽可能多的时间留给2次串口 *** 作之间的程序,而不是把等待字节发送的时间白白空等待浪费掉。所以,在系统初始化的时候,一定要令TI=1; 就可以顺畅的使用printf函数了。搂主sbuf=" "的办法,其实就是令TI=1 另外要特别注意,printf函数执行完毕后,最后一个字节并未发送完毕,例如在485通讯中,此时如果切换为收模式,会丢失最后一字节
3一般串口发送都是等TI(字节发送完标志)为1就马上发送下一字节,由于不管是中断还是查询TI标志的方法,都会检测TI,因此首次发送必须置 位TI标志,使串口开始发送你的“在程序的初始化部分往串口数据寄存器SBUF里放一个字符来起用终端显示;”方法最终作用也就是把TI置1,改成 TI=1;来启动发送也是一样的(当然,不会发出那个' '字符了)。
4<stdioh>中定义,调用底层的putchar()来实现底层发送数据到串口时,先查TI=1是否成立,死等直到TI=1时将新数据写入SBUF,函数返回,所以要先将TI置1,启动第一次传输 *** 作可查看反汇编相关代码理解其工作机理!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)