003-scanf函数使用和表达式-C语言笔记

学习目标

1.【掌握】输入函数scanf的基本使用方法

2.【掌握】输入函数scanf运行原理和缓冲区理解

3.【掌握】算术运算符和算术表达式的使用

4.【了解】数据类型自动转换和强制转换

5.【掌握】赋值运算符和复合赋值运算符

6.【掌握】自增自减运算符的使用注意

7.【掌握】逗号表达式

一、输入函数scanf的基本使用方法

scanf函数的声明在标准输入输出头文件“stdio.h”中,这个函数用于接受键盘输入的内容。

语法:scanf("格式控制字符串",输入项地址列表);

格式控制字符串:规定数据输入的格式,由格式控制符和普通字符组成,格式控制符和百分号(%)一起使用,用来说明输入数据的数据类型(格式字符)。

输入项地址列表:需要接收数据的变量地址,这些输入项与格式控制字符串在类型和数量上要对应,当有多个输入项时,各个地址名之间以逗号“,”分隔。输入格式和变量类型要保持一致。

在C语言中,变量的地址可以通过地址运算符 & 得到

 
1
2
inta=10,b=20;
&a,&b;//取得变量a、b的地址

常见的scanf格式控制符

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
 
intmain(intargc,constchar*argv[]){
 
    //定义两个int类型的变量用于储存QQ账号和密码,并初始化
    intqqNumber=0,qqPassWord=0;
    
    //提示用户输入QQ账号
    printf("请输入你的QQ账号:\n");
    
    //接收用户输入的QQ账号并储存到qqNumber变量中
    scanf("%11d",&qqNumber);
    
    //提示用户输入QQ密码
    printf("请输入你的QQ密码:\n");
    
    //接收用户输入的QQ密码
    scanf("%16d",&qqPassWord);
    
    printf("你的QQ:%d登陆成功!\n",qqNumber);
/*
请输入你的QQ账号:
44334512
请输入你的QQ密码:
123456
你的QQ:44334512登陆成功!
*/
    return0;
}

二、输入函数scanf运行原理和缓冲区理解

使用scanf函数并不是直接将用户输入的数据赋值给变量,而且先将用户输入的数据全部存到缓冲区,注意任何字符都会存到缓冲区(包括回车),然后才给依次给变量赋值。如果缓冲区的数据不为空,调用scanf函数会直接从缓冲区中获取数据,而不会要求用户输入。

解决办法:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
 
intmain(intargc,constchar*argv[]){
 
    intnum=0,Num=0;
    charch='a';
    printf("请输入:\n");
    scanf("%d%d",&num,&Num);
    rewind(stdin);//清空缓存区的所有数据
    printf("请输入:\n");
    scanf("%c",&ch);//这样ch就能正确接收到用户输入的内容
    
    printf("num = %d,Num = %d,ch = %c\n",num,Num,ch);
    /*
    控制台输出
    请输入:
    34 424 y 34 y
    请输入:
    y
    num = 34,Num = 424,ch = y
    */
    return0;
}

三、算术运算符和算术表达式的使用

算术表达式就是算术运算符连接起来的式子,C语言里的表达式的结果不处理也不会报错,只是会警告提示表达式结果未被使用。

求余运算中,如果两个数中有负数,余数的正负取决于第一个数的正负

 
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
intmain(){
        intresult1=-10%3;
        intresult2=10%-3;
        printf("result1 = %d\n",result1);//result1 = -1
        printf("result2 = %d\n",result2);//result2 = 1
 
    return0;
}

四、数据类型自动转换和强制转换

类型转换分为:隐式数据类型转换和显式数据类型转换

隐式转换:

 
1
2
3
4
inti=1;
 
i=i+9.801;//i转换为double型再与9.801相加,然后将结果转换为整型赋值给i
printf("i = %d\n",i);//i = 10

显式转换:

 
1
2
3
4
inti=1;
 
i=i+(int)9.801;//将9.801转换为整型再与i相加,然后将结果直接赋值给i
printf("i = %d\n",i);//i = 10

将大范围的数据赋值给小范围变量时,系统会自动做一个强制类型转换的操作,这样容易丢失精度。

 
1
2
3
4
5
6
7
8
9
inti=10.7;//也可用明显地进行强制转换
 
inti=(int)10.7;//常见的类型转换
 
inta=198l;//long 转换为 int
 
charb=65;//int 转换为 char
 
intc=19.5f;//float 转换为 int

五、赋值运算符和复合赋值运算符

赋值运算符:赋值运算符标记为“=”,这个不是等于哈,是将赋值运算符右边的表达式的值赋值给左边的变量。赋值运算符都是从右向左赋值。

 
1
2
3
inta,b,c;
 
a=b=c=10;//这里是将10赋值给c,然后将c的值赋值给b,再将b的值赋值给a。

复合赋值运算符:在赋值运算符 “=” 前加上其它二目运算符可构成复合赋值运算符。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
intmain(intargc,constchar*argv[]){
 
    inta=10;//声明一个int类型变量a,并将10赋值给变量a
    
    intb,c,d,e;//声明4个int类型变量,b,c,d,e。
    
    b=c=d=e=10;//从右到左为变量赋值。
    
    a+=10;//等价于 a = a + 10;
    b-=10;//等价于 b = b - 10;
    c*=10;//等价于 c = c * 10;
    d/=10;//等价于 d = d / 10;
    e%=10;//等价于 e = e % 10;
    
    printf("a = %d\nb = %d\nc = %d\nd = %d\ne = %d\n",a,b,c,d,e);
    return0;
}

六、自增自减运算符的使用注意

在程序设计中,经常遇到“i = i + 1”和“i = i - 1”这两种极为常用的操作。C语言为这种操作提供了两个更为简洁的运算符,即++和--,分别叫做自增运算符和自减运算符。它们是单目运算符,是从右向左结合的算术运算符。

前缀表达式

 
1
++x,--x;

先完成变量的自增自减1运算,再用x的值作为表达式的值。即“先变后用”,也就是变量先进行自增自减运算,再将变量参与运算。

后缀表达式

 
1
x++,x--;

先用x的当前值作为表达式的值,再进行自增自减1运算。即“先用后变”,也就是将变量参与运算,然后才对变量进行自增自减运算。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
intmain(intargc,constchar*argv[]){
 
    inti=1;
    intb=10;
    printf("i++ = %d\n",i++);//这里++在后,所以i++表达式的值是1,但此后i也自增了1
    printf("i = %d\n",i);//这里i就是2了
    
    b+=++i;//这里++在前,所以++i表达式的值是3,10+3=13
    printf("b = %d\n",b);//b=13
    printf("i = %d\n",i);//i=3
    
    b+=i++;//这里++又在后了,所以i++表达式的值也是3,用完表达式的值后,i自增了1
    printf("b = %d\n",b);//13+3=16
    printf("i = %d\n",i);//i=4
    
    return0;
}

七、逗号表达式

在C语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把多个表达式连接起来组成一个表达式,称为逗号表达式。逗号表达式的值就是从左到右计算各个表达式,取最后一个表达式的值为逗号表达式的值。

 
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
intmain(){
    inta=10,b=20,c=30;
    intresult=(a+b,b+c);
    printf("result = %d",result);//result = 50
 
    return0;
}

如果你光看了这个实例,认为逗号表达式的值就是只看最后一个表达式,那就大错特错了。

 
1
2
3
4
5
6
7
8
#include <stdio.h>
 
intmain(intargc,constchar*argv[]){
    inti=1;
    intresult=(i++,i++,++i);//i++ i++了两次,i就变成了3,然后最后一个表达式是++i,所以表达式的值就是4
    printf("result = %d\n",result);//result = 4
    return0;
}

003-scanf函数使用和表达式-C语言笔记的更多相关文章

  1. C语言中scanf函数的实现

    接上一篇C语言中可变参数函数实现原理,从理论上详细介绍了C语言中可变参数函数的实现,这一篇从minix内核源码中的scanf函数入手,学习C语言经典可变参数函数的实现过程 在scanf.c文件中,可以 ...

  2. C语言scanf函数详细解释

    原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...

  3. C语言Scanf函数

    C语言的scanf函数 一.变量的内存分析 (一)字节与地址 ①. 内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间 ...

  4. [转载]VS2012编译C语言scanf函数error的解决方法

    在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: error C4996: 'scanf': This function or variable may ...

  5. 【C语言】05-printf和scanf函数

    一.printf函数 这是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据 1.用法 1> pr ...

  6. 黑马程序员——C语言基础 scanf函数 基本运算 三目运算符

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (一下内容是对黑马苹果入学视频的个人知识点总结) (一)scanf函数 1>  简单介绍一下scanf函数   这是在 ...

  7. 【学习笔记】【C语言】scanf函数

    1. 简介 这也是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>.调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待标准输入设 ...

  8. C语言第五节scanf函数

    变量的内存分析 字节和地址 为了更好地理解变量在内存中的存储细节,先来认识一下内存中的"字节"和"地址". 内存以"字节为单位" 0x表示的 ...

  9. 【C语言】03-printf和scanf函数

    一.printf函数 这是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据 1.用法 1> pr ...

随机推荐

  1. centos 7 中没有iptables 和service iptables save 指令使用失败问题解决方案

    1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 如果上述命令 ...

  2. Java单例设计模式的实现

    1. 单例设计模式的定义 单例设计模式确保类只有一个实例对象,类本身负责创建自己的对象并向整个系统提供这个实例.在访问这个对象的时候,访问者可以直接获取到这个唯一对象而不必由访问者进行实例化. 单例设 ...

  3. 学习vue前的准备工作

    起步 1.扎实的HTML/CSS/Javascript基本功,这是前置条件. 2.不要用任何的构建项目工具,只用最简单的<script>,把教程里的例子模仿一遍,理解用法.不推荐上来就直接 ...

  4. 题解 P1985 【[USACO07OPEN]翻转棋】

    讲讲我的做法 刚开始做这道题的时候,看到\(n<=15\),我这个\(6\)年级的蒟蒻的第1反应是状压\(dp\).貌似不好做.然而,等到我在省中集训的时候,老师的一席话,让我豁然开朗.今天我准 ...

  5. BFS与DFS常考算法整理

    BFS与DFS常考算法整理 Preface BFS(Breath-First Search,广度优先搜索)与DFS(Depth-First Search,深度优先搜索)是两种针对树与图数据结构的遍历或 ...

  6. UVA11987 Almost Union-Find 并查集的节点删除

    题意: 第一行给出一个n,m,表示 n个集合,里面的元素为1~n,下面有m种操作,第一个数为 1 时,输入a,b 表示a,b 两个集合合并到一起,第一个数为 2 时,输入a,b表示将 a 从他原来的集 ...

  7. React Hooks 实现react-redux

    Redux 是目前 React 系统中最常用的数据管理工具,它落实并发扬了 Flux 的数据单向流动模式,被实践证明为一种成熟可用的模式. 尽管承受着一些非议,Redux 在 React 数据管理界的 ...

  8. [算法]移除指定元素&strSr()的实现

    移除指定元素 题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原 ...

  9. SpringBoot环境搭建及第一个程序运行(详细!)

    spring boot简介 spring boot框架抛弃了繁琐的xml配置过程,采用大量的默认配置简化我们的开发过程. 所以采用Spring boot可以非常容易和快速地创建基于Spring 框架的 ...

  10. Java 异常处理与输入输出

    一.异常 1.1 package exception; import java.util.Scanner; public class ArrayIndex { public static void m ...