~的小妙用

Z_Jchen 2017-11-14 07:39:08
#include <stdio.h>

int main()
{
int a,b;
while(~scanf("%d%d",&a,&a)){
printf("%d",a+b);
}
return 0;
}

昨天看到一段代码,红色区域不是很懂,请教各位那个波浪号是什么含义(按位取反我知道)
...全文
369 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
hopyGreat 2017-11-16
  • 打赏
  • 举报
回复
一般在做算法题的时候 这种写法比较多 scanf是有返回值的,返回的是成功输入的值的个数 要是读到文件尾就是EOF(=-1) 返回值也是-1 算法题输入常常有这种描述 题目有多组输入,处理文件尾 这种情况一般写法是 while( scanf("%d",n)!= EOF ) 但是你这种方法就是简写了 这里再说一下为什么可以这样写 当读到文件尾的时候scanf的返回值是EOF(=-1) ~是C语言按位取反 -1在计算机里是以补码存放 也就是 -1 = 二进制补码(1111 1111) 对-1按位取反就得到了 二进制补码(0000 0000) 这个值是0 while表达式里面的判断式值为0 就结束循环输入了。
热血打工人 2017-11-15
  • 打赏
  • 举报
回复
按位取反 。。
漫步者、 2017-11-15
  • 打赏
  • 举报
回复
几百年没来了
自信男孩 2017-11-14
  • 打赏
  • 举报
回复
引用 8 楼 iloveyou418 的回复:
[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 iloveyou418 的回复:] 将scanf函数的返回值取反,等到进行输入就会printf。代码还有点问题 while(~scanf("%d%d",&a,&b) 不然printf会报错,因为b没初始化,也没进行赋值
可以不对b进行初始化,因为scanf就是通过终端输入将输入的数据写到b内存里的。相当于赋值操作;只是和这个初始化是终端输入的。a也是一样的。[/quote] 问题是他也没进行赋值操作。。[/quote] scanf就是将输入的数据写到a,b所在内存的空间里。不就是类似赋值操作吗?!
FancyMouse 2017-11-14
  • 打赏
  • 举报
回复
引用 6 楼 lin5161678 的回复:
scanf 出错 会返回一个EOF
这个都是不对的。scanf只有在实际读到了EOF才会返回EOF。如果是%d%d但是第二个数字读到字符的时候scanf会返回1,表示正确读入了1个变量。
CT8100 2017-11-14
  • 打赏
  • 举报
回复
引用 3 楼 cfjtaishan 的回复:
[quote=引用 2 楼 iloveyou418 的回复:] 将scanf函数的返回值取反,等到进行输入就会printf。代码还有点问题 while(~scanf("%d%d",&a,&b) 不然printf会报错,因为b没初始化,也没进行赋值
可以不对b进行初始化,因为scanf就是通过终端输入将输入的数据写到b内存里的。相当于赋值操作;只是和这个初始化是终端输入的。a也是一样的。[/quote] 问题是他也没进行赋值操作。。
CT8100 2017-11-14
  • 打赏
  • 举报
回复
引用 2 楼 iloveyou418 的回复:
将scanf函数的返回值取反,等到进行输入就会printf。代码还有点问题 while(~scanf("%d%d",&a,&b) 不然printf会报错,因为b没初始化,也没进行赋值
你这个程序可没有对b赋值。。。。你应该是写错了
while(~scanf("%d%d",&a,&a)
lin5161678 2017-11-14
  • 打赏
  • 举报
回复
一个坏习惯 scanf 出错 会返回一个EOF EOF按照标准规定是 负数 常见实现是 -1 -1 二进制都是 1 ~-1 结果是0 其实想表达 scanf != EOF 这样的意思 但结果依赖实现
自信男孩 2017-11-14
  • 打赏
  • 举报
回复
不建议使用~按位取反判断scanf的返回值,建议使用
while (scanf("%d%d", &a, &b) == 2)
自信男孩 2017-11-14
  • 打赏
  • 举报
回复
波浪号是按位取反,即scanf("%d%d", &a, &b);若正确输入,则会返回2,即输入两个数值。2的二进制数表示位0000 0000 0000 0000 0000 0000 0000 0010 取反之后就是1变成0,其他位都变成1; 若输入一个错误,比如输入1 a;那么返回1,取反之后就变成1111 1111 1111 1111 1111 11111 1111 11110
自信男孩 2017-11-14
  • 打赏
  • 举报
回复
引用 2 楼 iloveyou418 的回复:
将scanf函数的返回值取反,等到进行输入就会printf。代码还有点问题 while(~scanf("%d%d",&a,&b) 不然printf会报错,因为b没初始化,也没进行赋值
可以不对b进行初始化,因为scanf就是通过终端输入将输入的数据写到b内存里的。相当于赋值操作;只是和这个初始化是终端输入的。a也是一样的。
CT8100 2017-11-14
  • 打赏
  • 举报
回复
将scanf函数的返回值取反,等到进行输入就会printf。代码还有点问题 while(~scanf("%d%d",&a,&b) 不然printf会报错,因为b没初始化,也没进行赋值
FoolCarpe 2017-11-14
  • 打赏
  • 举报
回复
对scanf函数的返回值进行取反操作
CT8100 2017-11-14
  • 打赏
  • 举报
回复
引用 13 楼 cfjtaishan 的回复:
[quote=引用 12 楼 iloveyou418 的回复:] [quote=引用 10 楼 cfjtaishan 的回复:] [quote=引用 8 楼 iloveyou418 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 iloveyou418 的回复:] 将scanf函数的返回值取反,等到进行输入就会printf。代码还有点问题 while(~scanf("%d%d",&a,&b) 不然printf会报错,因为b没初始化,也没进行赋值
可以不对b进行初始化,因为scanf就是通过终端输入将输入的数据写到b内存里的。相当于赋值操作;只是和这个初始化是终端输入的。a也是一样的。[/quote] 问题是他也没进行赋值操作。。[/quote] scanf就是将输入的数据写到a,b所在内存的空间里。不就是类似赋值操作吗?![/quote] 。。。你先看清楚他的代码呀,我给你复制一下
 while(~scanf("%d%d",&a,&a)){
[/quote] 这是属于手误吧[/quote] 。。。哼~我不管~
lin5161678 2017-11-14
  • 打赏
  • 举报
回复
引用 9 楼 FancyMouse 的回复:
[quote=引用 6 楼 lin5161678 的回复:] scanf 出错 会返回一个EOF
这个都是不对的。scanf只有在实际读到了EOF才会返回EOF。如果是%d%d但是第二个数字读到字符的时候scanf会返回1,表示正确读入了1个变量。[/quote] scanf 无法读到EOF EOF是scanf执行出错 得到的一个返回值 return EOF; 而不是一个读取到的数据 返回1 这种情况 不属于 scanf 出错 只是匹配失败
赵4老师 2017-11-14
  • 打赏
  • 举报
回复
//C++ Operators
//  Operators specify an evaluation to be performed on one of the following:
//    One operand (unary operator)
//    Two operands (binary operator)
//    Three operands (ternary operator)
//  The C++ language includes all C operators and adds several new operators.
//  Table 1.1 lists the operators available in Microsoft C++.
//  Operators follow a strict precedence which defines the evaluation order of
//expressions containing these operators.  Operators associate with either the
//expression on their left or the expression on their right;    this is called
//“associativity.” Operators in the same group have equal precedence and are
//evaluated left to right in an expression unless explicitly forced by a pair of
//parentheses, ( ).
//  Table 1.1 shows the precedence and associativity of C++ operators
//  (from highest to lowest precedence).
//
//Table 1.1   C++ Operator Precedence and Associativity
// The highest precedence level is at the top of the table.
//+------------------+-----------------------------------------+---------------+
//| Operator         | Name or Meaning                         | Associativity |
//+------------------+-----------------------------------------+---------------+
//| ::               | Scope resolution                        | None          |
//| ::               | Global                                  | None          |
//| [ ]              | Array subscript                         | Left to right |
//| ( )              | Function call                           | Left to right |
//| ( )              | Conversion                              | None          |
//| .                | Member selection (object)               | Left to right |
//| ->               | Member selection (pointer)              | Left to right |
//| ++               | Postfix increment                       | None          |
//| --               | Postfix decrement                       | None          |
//| new              | Allocate object                         | None          |
//| delete           | Deallocate object                       | None          |
//| delete[ ]        | Deallocate object                       | None          |
//| ++               | Prefix increment                        | None          |
//| --               | Prefix decrement                        | None          |
//| *                | Dereference                             | None          |
//| &                | Address-of                              | None          |
//| +                | Unary plus                              | None          |
//| -                | Arithmetic negation (unary)             | None          |
//| !                | Logical NOT                             | None          |
//| ~                | Bitwise complement                      | None          |
//| sizeof           | Size of object                          | None          |
//| sizeof ( )       | Size of type                            | None          |
//| typeid( )        | type name                               | None          |
//| (type)           | Type cast (conversion)                  | Right to left |
//| const_cast       | Type cast (conversion)                  | None          |
//| dynamic_cast     | Type cast (conversion)                  | None          |
//| reinterpret_cast | Type cast (conversion)                  | None          |
//| static_cast      | Type cast (conversion)                  | None          |
//| .*               | Apply pointer to class member (objects) | Left to right |
//| ->*              | Dereference pointer to class member     | Left to right |
//| *                | Multiplication                          | Left to right |
//| /                | Division                                | Left to right |
//| %                | Remainder (modulus)                     | Left to right |
//| +                | Addition                                | Left to right |
//| -                | Subtraction                             | Left to right |
//| <<               | Left shift                              | Left to right |
//| >>               | Right shift                             | Left to right |
//| <                | Less than                               | Left to right |
//| >                | Greater than                            | Left to right |
//| <=               | Less than or equal to                   | Left to right |
//| >=               | Greater than or equal to                | Left to right |
//| ==               | Equality                                | Left to right |
//| !=               | Inequality                              | Left to right |
//| &                | Bitwise AND                             | Left to right |
//| ^                | Bitwise exclusive OR                    | Left to right |
//| |                | Bitwise OR                              | Left to right |
//| &&               | Logical AND                             | Left to right |
//| ||               | Logical OR                              | Left to right |
//| e1?e2:e3         | Conditional                             | Right to left |
//| =                | Assignment                              | Right to left |
//| *=               | Multiplication assignment               | Right to left |
//| /=               | Division assignment                     | Right to left |
//| %=               | Modulus assignment                      | Right to left |
//| +=               | Addition assignment                     | Right to left |
//| -=               | Subtraction assignment                  | Right to left |
//| <<=              | Left-shift assignment                   | Right to left |
//| >>=              | Right-shift assignment                  | Right to left |
//| &=               | Bitwise AND assignment                  | Right to left |
//| |=               | Bitwise inclusive OR assignment         | Right to left |
//| ^=               | Bitwise exclusive OR assignment         | Right to left |
//| ,                | Comma                                   | Left to right |
//+------------------+-----------------------------------------+---------------+
赵4老师 2017-11-14
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!) VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
csdnwjj 2017-11-14
  • 打赏
  • 举报
回复
其实就是把你输入的数变成二进制 数然后按位取反
自信男孩 2017-11-14
  • 打赏
  • 举报
回复
引用 12 楼 iloveyou418 的回复:
[quote=引用 10 楼 cfjtaishan 的回复:] [quote=引用 8 楼 iloveyou418 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 iloveyou418 的回复:] 将scanf函数的返回值取反,等到进行输入就会printf。代码还有点问题 while(~scanf("%d%d",&a,&b) 不然printf会报错,因为b没初始化,也没进行赋值
可以不对b进行初始化,因为scanf就是通过终端输入将输入的数据写到b内存里的。相当于赋值操作;只是和这个初始化是终端输入的。a也是一样的。[/quote] 问题是他也没进行赋值操作。。[/quote] scanf就是将输入的数据写到a,b所在内存的空间里。不就是类似赋值操作吗?![/quote] 。。。你先看清楚他的代码呀,我给你复制一下
 while(~scanf("%d%d",&a,&a)){
[/quote] 这是属于手误吧
CT8100 2017-11-14
  • 打赏
  • 举报
回复
引用 10 楼 cfjtaishan 的回复:
[quote=引用 8 楼 iloveyou418 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 iloveyou418 的回复:] 将scanf函数的返回值取反,等到进行输入就会printf。代码还有点问题 while(~scanf("%d%d",&a,&b) 不然printf会报错,因为b没初始化,也没进行赋值
可以不对b进行初始化,因为scanf就是通过终端输入将输入的数据写到b内存里的。相当于赋值操作;只是和这个初始化是终端输入的。a也是一样的。[/quote] 问题是他也没进行赋值操作。。[/quote] scanf就是将输入的数据写到a,b所在内存的空间里。不就是类似赋值操作吗?![/quote] 。。。你先看清楚他的代码呀,我给你复制一下
 while(~scanf("%d%d",&a,&a)){
在Excel使用过程中,运用一些技巧会使得我们的工作效率提高很多。而这些技巧往往又被忽略或忘记怎么去使用。本套课程基于此整理了一些Excel方面的技巧,这些呢为学习笔记集锦,前后章内容不存在连贯性,仅整理一些常用的技巧与大家分享。【说明:Excel为2013版本,无下载资料,请参看课程视频学习。】l  本课程知识点l  第1节:概述l  第2节:Excel大批量数据自动填写灵活妙用经验分享l  第3节:巧为Excel2013单元格的文本内容增加拼音l  第4节:Excel在单元格内实现自动换行l  第5节:Excel快速使用函数计算不同区域数据l  第6节:Excel单元格超长内容不能显示全巧妙设置l  第7节:巧妙运用之Excel单元格中自动快速输入带有小数点的数值l  第8节:Excel巧妙使用回车键快速粘贴l  第9节:职场必会Excel函数经典应用,使用And函数多条件判断l  第10节:Excel函数经典应用之IF函数条件判断范例l  第11节:Excel技巧之巧妙使用不同颜色区分不同类型数据l  第12节:巧妙快速调整Excle所有单元格或局部单元格l  第13节:巧妙快速切换Excel单元格回车后的纵向输入和横向输入l  第14节:巧妙理解记忆Excel公式中的相对引用和绝对引用l  第15节:Excel单元格文风快速两端对齐l  第16节:Excel2013文档内容快速居中打印l  第17节:excel直接使用模板制作精美格式样式l  第18节: excel使用中可以直接使用翻译功能中英文互译l  第19节:不需要截图工具直接使用excel复制图片l  第20节:excel粘贴也可以多种方式选择了l  第21节:巧为excel单元格画双划线l  第22节:为excel的文字或数字添加单划线或双划线l  第23节:excel连续微调单元格内容字号的大小l  第24节: 快速的将长文本内容变为自适应多行文本l  第25节:excel多单元格合并居中l  第26节:单元格内容连续微调缩进量l  第27节:将文本内容倾斜到任意角度l  第28节:单元格内容多种形式的对齐方式l  第29节:快速将数据转换为会计专用数据l  第30节:快速为数据增加或减少小数位数

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧