格式控制符 和 scanf
C语言格式控制符 和 scanf
C语言格式控制符 和 scanf
格式控制符
1 | %a 浮点数、十六进制数字和p-记数法(c99) |
1 | printf("整数: %d", 90); |
修饰符
修饰符 | 意义 |
---|---|
l | 用于长整型和双精度实型数据,可加在格式字符 d、o、x、u、f 前面。 |
m (正整数) | 数据最小宽度 |
n (正整数) | 对于实数,表示输出n位小数; 对于字符串,表示截取的字符个数。 |
- | 输出的数字或字符在域内向左靠,右边填空格 |
# | 当整数以八进制或十六进制形式输出时,输出前缀。可加在格式字符o、x前面。 |
1 | // %m.nf 举例 |
指数e
e/E
之前必须有数字- 指数(E之后的数)必须为整数,正负均可
e
用在浮点数上,整型没有e
1 | printf("%.2f\n", 3e2); // 3*(10*10) 输出 300.00 |
1 | // 判断2个浮点数差是否是 0, |
浮点数范围
一般float型只能精确到小数后六位(即1e-6),float的精度误差在1e-6;double精度误差在1e-15
运算符
类型转化
- 两个运算量类型一致时,与两个运算量的类型一致。
- 两个运算量类型不一致时,表达式的类型与其中较高类型运算量的类型一致(较低类型运算量先被自动转换为高类型再运算)
1 | #低类型转换为高类型: |
优先级最高 逻辑非!
++
--
三目运算符: 优先级倒数第三, “从右到左”的结合性
复合的赋值运算符与赋值运算符(=)相同:优先级倒数第二, “从右到左”的结合性
逗号运算符优先级最低(倒数第一),结合顺序为自左至右。
其他
1 | // 字符串运算 |
三目运算符
1 | a > b ? a : c > d ? c : d 这个式子应该理解为如下: |
逗号运算符
1 | 表达式1 , 表达式2 , 表达式3 |
- 依次从左到右分别计算各个表达式的值
- 整个“逗号表达式”的值为其中最后一个表达式(上例为表达式 3)的值。
逗号运算符优先级最低(倒数第一),结合顺序为自左至右。
1 | 如有int a=2, b=4, c=6, x, y; |
逻辑运算符
逻辑运算符 &&
,||
,!
运算符 | 描述 | 实例 | ||||
---|---|---|---|---|---|---|
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真 | (1&&1) 为真 | ||||
\ | \ | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真 | (0\ | \ | 1) 为真 | |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。 如果条件为真则逻辑非运算符将使其为假(简单理解: 取反) |
(!0) 为真 (!1) 为假 |
逻辑与 &&
和逻辑 ||
的 短路操作
位运算符
位运算符 &
, |
,^
,~
,>>
,<<
, 这几个都是按照二进制进行运行
按位与 &
, 离散数学中合取 ∧
按位或 |
, 离散数学中析取 ∨
取反 ~
, 离散数学中非 ┐
位运算真值表
p | q | p&q | p\ | q |
---|---|---|---|---|
0 | 0 | 0 | 0 | |
0 | 1 | 0 | 1 | |
1 | 0 | 0 | 1 | |
1 | 1 | 1 | 1 |
异或运算符 ^
, 实现2数交换
1 | int a = 1, b = 2; |
类型说明符
类型说明符为int、long、unsigned、float、double 、char等
字符型常量
用英文单引号
括起来,只保存一个字符’a’、’b’ 、’*’ ,还有转义字符 ‘\n’ 、’\t’。
字符串常量
用英文的双引号
引起来 可以保存多个字符:”abc”。
输入输出
putchar()
函数——单字符输出getchar()
函数——单字符输入- 格式输出函数
printf()
- 格式输入函数
scanf()
1 | // 输出2个字符 |
格式输出函数 printf
1 | // 格式控制符对应从左到右的表达式 左-->右 |
1 | char foo = 'A'; |
格式输入函数 scanf
1 | #使用规则 |
在输入数据时,默认遇空格或按“回车”表示该数据结束,但是格式输入控制中无需加\n。
输入数据时不能规定小数位数
要是有逗号要原样输入
1
2int a, b;
scanf("%d,%d",&a,&b); // %d,%d 之间的逗号要原样输入1
2
3
4// width 截取
char foo[5]; // 定义字符串
scanf("%3c",&foo); // 截取width为3
printf ("输入的值为%s", foo);
注意事项
- 如果相邻两个格式控制符之间,不指定数据分隔符(如逗号、冒号等),则相应的两个输入数据之间至少用一个空格分隔,或者用Tab键分隔,或者输入一个数据后,按回车,然后再输入下一个数据
- 格式控制字符串中出现的常规字符(包括转义字符),务必原样输入
- 当格式控制字符串中指定了输入数据的域宽
width
时,将读取输入数据中相应的width
位,但按需要的位数赋给相应的变量,多余的部分被舍去 - 当格式控制字符串中含有抑制符
*
时,表示本输入项对应的数据读入后,不赋给相应的变量(该变量由下一个格式指示符输入) - 使用格式控制符
%c
输入单个字符时,空格和转义字符均作为有效字符被输入 - 输入数据时,遇到以下情况,系统被认为 该数据结束
- 遇到空格,或者回车键,或者
Tab
键 - 遇到输入域宽度结束,例如
%3d
,只取3列 - 遇到非法输入,毕方说,在输入数值数据时,遇到字母等非数值符号
- 遇到空格,或者回车键,或者
- 当一次
scanf
调用需要输入多个数据项时,如果前面数据的输入遇到非法字符,并且输入的非法字符不是格式控制字符串中的常规字符,那么,这种 非法输入将影响后面的输入,导致数据输入失败 - 个人理解—
scanf
里面的格式控制符要和定义常量(变量)保持一致
1 | // 测试数据,依次输入 A B C D (记得加空格),没有使用fflush(stdin),第四个字母一直输入不进去 |
1 | // scanf里面的格式控制符要和定义常量(变量)保持一致 |
底部
没有了