万能的8u帮帮忙
c语言吧
全部回复
仅看楼主
level 7
水镜Q 楼主
之前听一个8u说,scanf用%d会读入四个字节,会破坏了short类型的两个字节,那这样,为什么每次最后的那一个还是
正确的
(如图) 。
当我问别人上述问题时,他说:“%d 的d 代表10进制的意思,他与几字节无关。”,他反驳了那位8u的观点,但他并没有给我解释我的问题(从头开始,为什么不能正确输出)
下面讲述下我的想法:如果做对照的话,将short类型换成int类型就能正常输出,声明和打印应该不会有问题,那就是输入这个环节产生了问题,&是必须的,那只能是%d有问题,正好没有专门为short类型创造对应的转义字符,所以别人说的“scanf用%d会读入四个字节,破坏了short类型的两个字节”这句话使我信服,
关键的问题是既然有问题就应该都有问题,怎么还有一个能正确输出,我试过几次,每次都是最后一个能正确输出
2022年08月13日 10点08分 1
level 7
水镜Q 楼主
2022年08月13日 10点08分 2
吧务
level 14
short有对应的转换说明符,是hd
2022年08月13日 10点08分 4
level 9
我说的破坏了short的两个字节的意思不是说破坏了录入的那个,是破坏了临近的那个
因为申请的变量是连续的,它们的内存挨在一起
所以你录入num2的时候,写了4个字节,低2字节写到了num2,值也是对的,但是高2字节写到了num1,而且因为你录的都是比较小的数,高2字节都是0,所以顺势破坏了num1,把num1置成0了
录入num3的时候破坏了num2,录入num4时破坏了num3,以此类推
所以最后的num6是对的
2022年08月13日 10点08分 6
哦哦
2022年08月13日 10点08分
用short好了
2022年08月13日 11点08分
level 7
水镜Q 楼主
原来是这样啊
2022年08月13日 10点08分 7
8u们真是见多识广[欢呼]
2022年08月13日 10点08分
level 9
从这个地址存入四字节要是相邻就会破坏
2022年08月13日 13点08分 11
level 7
水镜Q 楼主
终于理解了,把原来提问的楼都删了,不好看,下面分享一下我的心得[哈哈]
2022年08月13日 14点08分 12
简要说下我的理解:scanf用%d输入了一个四个字节的值,short只能储存后两个字节,前两个字节就会覆盖掉short前面的内存。用hd就输入两个字节的值,short刚好能储存。
2022年08月13日 23点08分
level 9
上cppreference.com,少走弯路哦[酷]
2022年08月13日 15点08分 13
level 6
看不懂,先马了
2022年08月13日 15点08分 14
level 10
好问题,之前确实没注意过这个问题,感觉白学了那么久的c[泪]short我个人用的太少了
2022年08月13日 18点08分 15
吧务
level 14
编译器分配给每个num变量的空间都是相邻的,于是你每次都覆盖了上一个num变量的空间,只有最后一个num得以幸免
2022年08月14日 02点08分 16
1