java移位运算符%3c%3c_scanf("%3c%3c", &a, &b)

问题

在书中看到这样的描述:

895611c0753c?utm_campaign=maleskine

我们按照这个来操作一下:

代码

#include

int main(int argc, char const *argv[])

{

char a, b;

scanf("%3c%3c\n", &a, &b);

printf("a = %c b = %c\n", a, b);

return 0;

}

输入:

abcdefg

输出:

a = e b = d

跟我们期望中有点不一样,我们希望他的结果是:a = a b = d,为什么会这样呢 ?

解答

这跟a b在内存中的地址是有关的

我们先看一下a b的地址:

#include

int main()

{

char a, b;

printf("a = %p\nb = %p\n", &a, &b);

return 0;

}

输出:

a = 0x7ffeebfb5bcb

b = 0x7ffeebfb5bca

a的地址值比b的大,说明a的地址在b的后面,也就是&a = &b + 1(&是取址符);

a b的位置如下图所示,一个地址(1个字节)存一个字符:

895611c0753c?utm_campaign=maleskine

a b的位置示意

把字符读进a的时候

从左到右读入:

895611c0753c?utm_campaign=maleskine

读入a

分别将字符a, b, c写进~cc,~cd,~ce里面

把字符读进b的时候

也是从左到右读入

895611c0753c?utm_campaign=maleskine

读入b

分别将字符d, e, f写进~ca,~cb,~cc里面。

注意!

原本地址~cb里面的a被新写入的e覆盖

原本地址~cc里面的b被新写入的f覆盖

打印a、b

因为char a的地址是~cb, ~cb里面现在是e

而char b的地址是~ca, ~ca里面现在是d

895611c0753c?utm_campaign=maleskine

输出结果

所心输出当然是:

a = e b = d

也可以验证一下,输出a地址右边那个地址里面的数,理论上应该是f

#include

int main(int argc, char const *argv[])

{

char a, b;

scanf("%3c%3c\n", &a, &b);

printf("a = %c b = %c a右边那个字符是:%c\n", a, b, *(&a + 1));

return 0;

}

输出结果:

a = e b = d a右边那个字符是:f

没错,就是这样。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值