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. mysql8 修改root密码

    Navicat工具里选中mysql数据库 执行: ALTER user 'root'@'localhost' IDENTIFIED BY 'newpassward'; //newpassward 新密 ...

  2. MassDNS:跨域DNS枚举工具

    MassDNS:跨域DNS枚举工具 simeon 原文地址:http://offsecbyautomation.com/Use-MassDNS/ 工具地址:https://github.com/ble ...

  3. MacOS下的渗透测试工具

    信息收集工具 工具名称 安装命令 CeWL brew install sidaf/pentest/cewl dirb brew install sidaf/pentest/dirb dnsrecon ...

  4. 动态规划-Minimum Cost to Merge Stones

    2019-07-07 15:48:46 问题描述: 问题求解: 最初看到这个问题的时候第一反应就是这个题目和打破气球的题目很类似. 但是我尝试了使用dp将问题直接转为直接合并到一个堆问题复杂度迅速提高 ...

  5. Windows平台安装Beautiful Soup

    Windows平台安装Beautiful Soup 2013-04-01 09:31:23|  分类: Python|举报|字号 订阅     Beautiful Soup是一个Python的一个库, ...

  6. OpenCV-Python 使用OCR手写数据集运行KNN | 五十四

    目标 在本章中 我们将使用我们在kNN上的知识来构建基本的OCR应用程序. 我们将尝试使用OpenCV自带的数字和字母数据集. 手写数字的OCR 我们的目标是构建一个可以读取手写数字的应用程序.为此, ...

  7. Samba centos7文件共享服务器搭建教程,可以更改任意需求操作配置详解。

    先安装软件   yum -y install samba-client 请看如下配置文件说明 [gongxiang]       comment = This is my shared folder  ...

  8. C++ 趣图

    一.心形 1. http://mathworld.wolfram.com/HeartCurve.html #include<stdio.h> using namespace std; in ...

  9. 使用错误代码对象进行C++错误处理

    原文发表于codeproject,由本人翻译整理分享于此. 前言 我已经使用了本文描述的代码和机制近20年了,到目前为止,我还没有找到更好的方法来处理大型C++项目中的错误.最初的想法是从一篇文章(D ...

  10. 记一次Windb死锁排查

    正在开会,突然线上站点线程数破千.然后一群人现场dump分析. 先看一眼线程运行状态 !eeversion 发现CPU占用并不高,19%,937条线程正在运行. 看看他们都在干什么. ~* e !cl ...