while(~scanf(“%d%d“,&a,&b))详解
本文最后更新于 737 天前,其中的信息可能已经过时,如有错误请发送邮件到 echobydq@gmail.com

while (~scanf (“% d% d“,&a,&b)) 详解

按位取反

1. 原码、反码、补码

原码:符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

反码:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

补码:正数的补码就是其本身;负数的补码是在原码的基础上, 符号位不变, 其余各位取反, 最后 + 1。 (即在反码的基础上 + 1)

十进制数原码反码补码
850101 01010101 01010101 0101
-851101 01011010 10101010 1011
90000 10010000 10010000 1001
-91000 10011111 01101111 0111

 

2. 取反符号:~

~ 取反运算,0 则变为 1,1 则变为 0,如

~ 1 0 0 1 1
-----------------------------
0 1 1 0 0

 

3. 按位取反

按位取反需要涉及以上概念。要弄懂这个运算符的计算方法,首先必须明白二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的。

下面以计算正数 9 的按位取反为例,计算步骤如下(注:前四位为符号位):

- 原码 : 0000 1001
- 算反码 : 0000 1001 (正数反码同原码)
- 算补码 : 0000 1001 (正数补码同反码)
- 补取反 : 1111 0110 (全位0110
- 算反码 : 1111 0101 (末位减1
- 算原码 : 1111 1010 (其他位取反)

 

总结

  1. 所有正整数的按位取反是其本身 + 1 的负数
  2. 所有负整数的按位取反是其本身 + 1 的绝对值
  3. 零的按位取反是 -1(0 在数学界既不是正数也不是负数)

 

scanf ( ) 的返回值

对于 scanf("%d%d%d",&a,&b,&c);

  1. 如果 a、b 和 c 都被成功读入,则 scanf 的返回值为 3
  2. 如果 a 和 b 被成功读入,那么返回值为 2
  3. 如果只有 a 被成功读入,那么返回值为 1
  4. 如果遇到错误或遇到 end of file,返回值为 EOF

 

其中,EOFEnd Of File 的缩写,在 C 语言标准库中的定义为:#define EOF (-1)

可参考此篇文章:字符输入输出和输入验证 – Echo (liveout.cn)

 

总结

scanf 成功读取至少一个数时,scanf 的返回值是 1 或 2,

1 按位取反为 - 2, 2 按位取反为 - 3,都会进入 while 循环内部。

当输入读取结束后,scanf 的返回值是 EOF,EOF 即 - 1,-1 按位取反为 0,此时会跳出 while 循环。

//这个意思一样
while(~scanf("%d%d",&a,&b))
while(scanf("%d%d",&a,&b) != EOF)

 

觉得有帮助可以投喂下博主哦~感谢!
作者:Echo
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议
转载请注明文章地址及作者哦~
暂无评论

发送评论(请正确填写邮箱地址,否则将会当成垃圾评论处理) 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇