长度
格式
:
printf("a = %[
长度
]
类型
", a)
;
转义字符
格式
:
printf("%f%%", 3.1415)
;
%
号在格式控制字符串中有特殊含义
,
所以想输出
%
必须添加一个转移字符
Scanf
函数
scanf
函数用于接收键盘输入的内容
,
是一个阻塞式函数
,
程序会停在
scanf
函数出现的地方
,
直到接收
到数据才会执行后面的代码
printf
函数的调用格式为
:
#include <stdio.h>
int
main
(){
// 1234.567871093750000
float
a
=
1234.567890123456789
;
// 1234.567890123456900
double
b
=
1234.567890123456789
;
printf
(
"a = %.15f\n"
,
a
);
//
前
8
位数字是准确的
,
后面的都不准确
printf
(
"b = %.15f\n"
,
b
);
//
前
16
位数字是准确的
,
后面的都不准确
}
#include <stdio.h>
int
main
(){
char
a
=
'a'
;
short int
b
=
123
;
int
c
=
123
;
long int
d
=
123
;
long long int
e
=
123
;
printf
(
"a = %hhd\n"
,
a
);
// 97
printf
(
"b = %hd\n"
,
b
);
// 123
printf
(
"c = %d\n"
,
c
);
// 123
printf
(
"d = %ld\n"
,
d
);
// 123
printf
(
"e = %lld\n"
,
e
);
// 123
}
#include <stdio.h>
int
main
(){
printf
(
"%f%%"
,
3.1415
);
//
输出结果
3.1415%
}
代码情缘
scanf("
格式控制字符串
",
地址列表
)
;
例如
:
scanf("%d", &num)
;
基本用法
地址列表项中只能传入变量地址
,
变量地址可以通过
&
符号
+
变量名称的形式获取
接收非字符和字符串类型时
,
空格、
Tab
和回车会被忽略
非格式字符串原样输入
,
格式控制字符串会赋值给地址项列表项中的变量
不推荐这种写法
接收多条数据
格式控制字符串和地址列表项在数量和类型上必须一一对应
#include <stdio.h>
int
main
(){
int
number
;
scanf
(
"%d"
,
&
number
);
//
接收一个整数
printf
(
"number = %d\n"
,
number
);
}
#include <stdio.h>
int
main
(){
float
num
;
//
例如
:
输入
Tab
空格 回车 回车
Tab
空格
3.14 ,
得到的结果还是
3.14
scanf
(
"%f"
,
&
num
);
printf
(
"num = %f\n"
,
num
);
}
#include <stdio.h>
int
main
(){
int
number
;
//
用户必须输入
number =
数字
,
否则会得到一个意外的值
scanf
(
"number = %d"
,
&
number
);
printf
(
"number = %d\n"
,
number
);
}
代码情缘
非字符和字符串情况下如果没有指定多条数据的分隔符
,
可以使用空格或者回车作为分隔符
(
不推荐
这种写法
)
非字符和字符串情况下建议明确指定多条数据之间分隔符
\n
是
scanf
函数的结束符号
,
所以格式化字符串中不能出现
\n
scanf
运行原理
系统会将用户输入的内容先放入输入缓冲区
scanf
方式会从输入缓冲区中逐个取出内容赋值给变量
如果输入缓冲区的内容不为空
,scanf
会一直从缓冲区中获取
,
而不要求再次输入
#include <stdio.h>
int
main
(){
int
number
;
scanf
(
"%d"
,
&
number
);
printf
(
"number = %d\n"
,
number
);
int
value
;
scanf
(
"%d"
,
&
value
);
printf
(
"value = %d\n"
,
value
);
}
#include <stdio.h>
int
main
(){
int
number
;
int
value
;
//
可以输入 数字 空格 数字
,
或者 数字 回车 数字
scanf
(
"%d%d"
,
&
number
,
&
value
);
printf
(
"number = %d\n"
,
number
);
printf
(
"value = %d\n"
,
value
);
}
#include <stdio.h>
int
main
(){
int
number
;
int
value
;
//
输入 数字
,
数字 即可
scanf
(
"%d,%d"
,
&
number
,
&
value
);
printf
(
"number = %d\n"
,
number
);
printf
(
"value = %d\n"
,
value
);
}
#include <stdio.h>
int
main
(){
int
number
;
//
输入完毕之后按下回车无法结束输入
scanf
(
"%d\n"
,
&
number
);
printf
(
"number = %d\n"
,
number
);
}
代码情缘
利用
fflush
方法清空缓冲区
(
不是所有平台都能使用
)
格式
:
fflush(stdin)
;
C
和
C++
的标准里从来没有定义过
fflush(stdin)
MSDN
文档里清除的描述着
"fflush on input stream is an extension to the C standard"
(
fflush
是在标准上扩充的函数
,
不是标准函数
,
所以不是所有平台都支持)
利用
setbuf
方法清空缓冲区
(
所有平台有效
)
格式
:
setbuf(stdin, NULL)
;
#include <stdio.h>
int
main
(){
int
num1
;
int
num2
;
char
ch1
;
scanf
(
"%d%c%d"
,
&
num1
,
&
ch1
,
&
num2
);
printf
(
"num1 = %d, ch1 = %c, num2 = %d\n"
,
num1
,
ch1
,
num2
);
char
ch2
;
int
num3
;
scanf
(
"%c%d"
,
&
ch2
,
&
num3
);
printf
(
"ch2 = %c, num3 = %d\n"
,
ch2
,
num3
);
}
#include <stdio.h>
int
main
(){
int
num1
;
int
num2
;
char
ch1
;
scanf
(
"%d%c%d"
,
&
num1
,
&
ch1
,
&
num2
);
printf
(
"num1 = %d, ch1 = %c, num2 = %d\n"
,
num1
,
ch1
,
num2
);
//fflush(stdin); //
清空输入缓存区
代码情缘
putchar
和
getchar
putchar:
向屏幕输出一个字符
getchar:
从键盘获得一个字符
运算符基本概念
和数学中的运算符一样
, C
语言中的运算符是告诉程序执行特定算术或逻辑操作的符号
例如告诉程序
,
某两个数相加
,
相减
,
相乘等
什么是表达式
表达式就是利用运算符链接在一起的有意义
,
有结果的语句
;
例如
: a + b;
就是一个算数表达式
,
它的意义是将两个数相加
,
两个数相加的结果就是表达式的
结果
注意
:
表达式一定要有结果
运算符分类
按照功能划分
:
算术运算符
setbuf
(
stdin
,
NULL
);
//
清空输入缓存区
char
ch2
;
int
num3
;
scanf
(
"%c%d"
,
&
ch2
,
&
num3
);
printf
(
"ch2 = %c, num3 = %d\n"
,
ch2
,
num3
);
}
#include <stdio.h>
int
main
(){
char
ch
=
'a'
;
putchar
(
ch
);
//
输出
a
}
#include <stdio.h>
int
main
(){
char
ch
;
ch
=
getchar
();
//
获取一个字符
printf
(
"ch = %c\n"
,
ch
);
}
代码情缘
赋值运算符
关系运算符
逻辑运算符
位运算符
按照参与运算的操作数个数划分
:
单目运算
只有一个操作数 如
: i++;
双目运算
有两个操作数 如
: a + b;
三目运算
C
语言中唯一的一个
,
也称为问号表达式 如
: a>b ? 1 : 0;
运算符的优先级和结合性
早在小学的数学课本中
,
我们就学习过
"
从左往右
,
先乘除后加减
,
有括号的先算括号里面的
",
这句话就
蕴含了优先级和结合性的问题
C
语言中
,
运算符的运算优先级共分为
15
级。
1
级最高
,15
级最低
在
C
语言表达式中
,
不同优先级的运算符
,
运算次序按照由高到低执行
在
C
语言表达式中
,
相同优先级的运算符
,
运算次序按照结合性规定的方向执行
代码情缘
优先级
名称
符号
说明
3
乘法运算符
*
双目运算符
,
具有左结合性
3
除法运算符
/
双目运算符
,
具有左结合性
3
求余运算符
(
模运算符
)
%
双目运算符
,
具有左结合性
4
加法运算符
+
双目运算符
,
具有左结合性
4
减法运算符
-
双目运算符
,
具有左结合性
算数运算符
注意事项
如果参与运算的两个操作数皆为整数
,
那么结果也为整数
如果参与运算的两个操作数其中一个是浮点数
,
那么结果一定是浮点数
求余运算符
,
本质上就是数学的商和余
"
中的余数
求余运算符
,
参与运算的两个操作数必须都是整数
,
不能包含浮点数
求余运算符
,
被除数小于除数
,
那么结果就是被除数
求余运算符
,
运算结果的正负性取决于被除数
,
跟除数无关
,
被除数是正数结果就是正数
,
被除数
是负数结果就是负数
代码情缘
求余运算符
,
被除数为
0,
结果为
0
求余运算符
,
除数为
0,
没有意义
(
不要这样写
)
#include <stdio.h>
int
main
(){
int
a
=
10
;
int
b
=
5
;
//
加法
int
result
=
a
+
b
;
printf
(
"%i\n"
,
result
);
// 15
//
减法
result
=
a
-
b
;
printf
(
"%i\n"
,
result
);
// 5
//
乘法
result
=
a
*
b
;
printf
(
"%i\n"
,
result
);
// 50
//
除法
result
=
a
/
b
;
printf
(
"%i\n"
,
result
);
// 2
//
算术运算符的结合性和优先级
//
结合性
:
左结合性
,
从左至右
int
c
=
50
;
result
=
a
+
b
+
c
;
// 15 + c; 65;
printf
(
"%i\n"
,
result
);
//
优先级
: * / %
大于
+ -
result
=
a
+
b
*
c
;
// a + 250; 260;
printf
(
"%i\n"
,
result
);
}
#include <stdio.h>
int
main
(){
//
整数除以整数
,
结果还是整数
printf
(
"%i\n"
,
10
/
3
);
// 3
//
参与运算的任何一个数是小数
,
结果就是小数
printf
(
"%f\n"
,
10
/
3.0
);
// 3.333333
}
#include <stdio.h>
int
main
(){
// 10 / 3
商等于
3,
余
1
int
result
=
10
%
3
;
printf
(
"%i\n"
,
result
);
// 1
//
左边小于右边
,
那么结果就是左边
result
=
2
%
10
;
printf
(
"%i\n"
,
result
);
// 2
//
被除数是正数结果就是正数
,
被除数是负数结果就是负数
result
=
10
%
3
;
printf
(
"%i\n"
,
result
);
// 1
result
= -
10
%
3
;
printf
(
"%i\n"
,
result
);
// -1
result
=
10
% -
3
;
代码情缘
优先级
名称
符号
说明
14
赋值运算符
=
双目运算符
,
具有右结合性
14
除后赋值运算符
/=
双目运算符
,
具有右结合性
14
乘后赋值运算符
(
模运算符
)
*=
双目运算符
,
具有右结合性
14
取模后赋值运算符
%=
双目运算符
,
具有右结合性
14
加后赋值运算符
+=
双目运算符
,
具有右结合性
14
减后赋值运算符
-=
双目运算符
,
具有右结合性
赋值运算符
简单赋值运算符
复合赋值运算符
printf
(
"%i\n"
,
result
);
// 1
}