7.单目操作符++,--,+,-
#include<stdio.h>
int main()
{
int a=5;
int b=a++;
printf("%d\n",a);
return 0;
}
后置++:a++先使用,在加1
前置++:++a先加1,在使用
--与++的使用方法一样
7.2 +和-
这里的+和-是正负号都是单目操作符
#include<stdio.h>
int main()
{
int a = -10;
printf("%d\n", a);
printf("%d\n", +a);
return 0;
}
8.强制类型转换(类型)
直接写出的字面浮点数,会被编译器直接识别为double
int main()
{
3.14;
3.24f;
int a =(int) 3.14;
printf("%d\n", a);
return 0;
}
9.scanf和printf介绍
9.1printf:print-打印 f-format-格式
printf 不会在末尾自动换行需要在输出末尾加\n
#include<stdio.h>
int main()
{
printf("hello \nword");
printf("hello");
printf("\n");
printf("word");
return 0;
}
9.1.2占位符(第一个字符一律为%)
printf()可以在输出文本中指定的占位符,所谓占位符,就是这个位置可以用其他值代入。
int main()
{
printf("there are 3 apples\n");
printf("there are %d apples\n",3);
return 0;
}
%d 是一种占位符,表示的10进制的有符号的整型
%s--字符串
int main()
{
printf("zhangsan will come to night\n");
printf("%s will come to night\n", "zhangsan");
printf("%s will come to night\n", "lisi");
return 0;
}
int main()
{
printf("%s says it is %d o'clock","wangwu",20);
return 0;
}
printf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就有n+1个
9.1.3占位符列举
printf() 的占位符有许多种类,与 C 语⾔的数据类型相对应。下⾯按照字⺟顺序,
列出常⽤的占位符,⽅便查找,具体含义在后⾯章节介绍。
% a :⼗六进制浮点数,字⺟输出为⼩写。
% A :⼗六进制浮点数,字⺟输出为⼤写。
% c :字符。
% d :⼗进制整数。//int
% e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
% E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
% i :整数,基本等同于 % d 。
% f :⼩数(包含 float 类型和 double 类型)。//float-%f double-%lf
% g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的e为⼩写。
% G :等同于 % g ,唯⼀的区别是指数部分的 E 为⼤写。
% hd :⼗进制 short int 类型。//
% ho :⼋进制 short int 类型。
% hx :⼗六进制 short int 类型。
% hu :unsigned short int 类型。//
% ld :⼗进制 long int 类型。//
% lo :⼋进制 long int 类型。
% lx :⼗六进制 long int 类型。
% lu :unsigned long int 类型。//
% lld :⼗进制 long long int 类型。
% llo :⼋进制 long long int 类型。
% llx :⼗六进制 long long int 类型。
% llu :unsigned long long int 类型。
% Le :科学计数法表⽰的 long double 类型浮点数。
% Lf :long double 类型浮点数。//
% n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
% o :⼋进制整数。
% p :指针。//(用来打印地址)
% s :字符串。//
% u :⽆符号整数(unsigned int)。//
% x :⼗六进制整数。//
% zd : size_t 类型。//
% %:输出⼀个百分号。
int main()
{
int a = -10;
printf("%d\n", a);
printf("%u\n", a);
return 0;
}
size_t 是无符号的整型类型
9.1.4输出格式
9.1.4.1限制宽度
printf()允许限定占位符的最小宽度
int main()
{
printf("%d\n", 123);
printf("%5d\n", 123);//右对齐,左边补空格,%5d表示这个占位符的宽度至少为5位
printf("%5d\n", 1234567);
printf("%-5d", 123);//左对齐
printf("%d", 123);
return 0;
}
int main()
{
printf("%f\n", 123.45);
printf("%12f\n", 123.45);
return 0;
}
9.1.4.2总是显示正负号
int main()
{
printf("%d\n", 12);
printf("%d\n", -12);
return 0;
}
9.1.4.3限制小数位数
希望小数点后保留2位,%.2分f
int main()
{
printf("%f\n", 123.45);//123.450000
printf("%.2f\n", 123.45);//123.45
return 0;
}
与限制宽度占位符结合起来
int main()
{
printf("%f\n", 0.5);
printf("%.2f\n", 0.5);
printf("%6.2f\n", 0.5);
return 0;
}
最小宽度和小数点这两个限定和值,都可以用*代替,通过printf()的参数传入、
int main()
{
printf("*.*f\n", 6,2,0.5);
return 0;
}
9.1.4.4输出部分字符
%s占位符用来输出字符
int main()
{
printf("hello word\n");
printf("%s","hello word\n");
printf("%.3s", "hello word\n");//hel
return 0;
}
9.2scanf(输入)
int main()
{
int score = 0;//输入一个成绩
printf("请输入成绩:");
scanf("%d", &score);//&取地址符号
printf("成绩是%d\n", score);
return 0;
}
9.2.1基本用法
scanf()用于读取用户键盘输入。程序运行到这个语句是时,会停下来,等待用户从键盘
输入,用户输入数据,按下回车键后,scanf()就会处理用户的输入,将其存入变量
它的原型定义在头文件stdio.h
scanf("%d", &i);
它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf()的占位符基本⼀致)
告诉编译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。
这是因为 C 语⾔的数据都是有类型的, scanf() 必须提前知道⽤⼾输⼊的数据类型,
才能处理数据。
它的其余参数就是存放⽤⼾输⼊的变量,格式字符串⾥⾯有多少个占位符,就有多少个
变量。上⾯⽰例中, scanf() 的第⼀个参数% d ,表⽰⽤⼾输⼊的应该是⼀个整数。% d
就是⼀个占位符,% 是占位符的标志, d 表⽰整数。第⼆个参数& i 表⽰,将⽤⼾从键
盘输⼊的整数存⼊变量i 。
注意:变量前⾯必须加上& 运算符(指针变量除外),因为 scanf() 传递的不是值,
⽽是地址,即将变量 i 的地址指向⽤⼾输⼊的值。
如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加& 运算符。
int main()
{
int i = 0;
int j = 0;
float x = 0.0f;
float y = 0.0f;
scanf("%d%d%f%f", &i,&j,&x,&y);
printf("i=%d\n", i);
printf("j=%d\n", j);
printf("x=%f\n", x);
printf("y=%f\n", y);
return 0;
}
scanf ()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等
scanf ()处理用户输入的原理是,用户的输入先放入缓存,等按下回车键后,按照占位符对缓存进行解读。
解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止
int main()
{
int x;
float y;//用户输入" -13.45e12# 0"
scanf("%d", &x);
printf("%d\n", x);
scanf("%f", &y);
printf("%f\n", y); //-13 449999994880.000000
return 0;
}
9.2.2scanf的返回值
scanf()的返回值是一个函数,表示成功读取的变量个数
如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或
者遇到读取到⽂件结尾,则返回常量 EOF(-1)。
int main()
{
int a = 0;
int b = 0;
float f = 0.0f;
int ret=scanf("%d %d %f", &a, &b, &f);//接受scanf的返回值
printf("ret=%d\n", ret);
printf("a=%d\n", a);
printf("b=%d\n", b);
printf("f=%d\n", f);
return 0;
}
scanf的返回值的理解很有用,在oj的刷题中,有多组输入场景的时候,可能会用到
oJ-online jugde在线判断
网页上写代码,网页上提交,判断结果是否正确(牛客题目)
9.2.3占位符
sacnf()常用的占位符如下,与printf()的占位符基本一致
%c %d %f %lf %s
%[]:在⽅括号中指定⼀组匹配的字符(⽐如 % [0 - 9] ),遇到不在集合之中的字符,匹配将会
停⽌。
上⾯所有占位符之中,除了 % c 以外,都会⾃动忽略起⾸的空⽩字符。 % c 不忽略空⽩字符,总是返
回当前第⼀个字符,⽆论该字符是否为空格。
int main()
{
int a = 0;
float b = 0.0f;
scanf("%d %f\n", &a, &b);
printf("%d %f\n", a, b);
}
int main()
{
char c1 = 0;
char c2 = 0;
char c3 = 0;
scanf("%c%c%c", &c1, &c2, &c3);
printf("%c %c %c", c1, c2, c3);//abc-->a b c
return 0; // abc--> a b
} //a b c-->a b
如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch) ,即% c 前加上⼀个空格,表
⽰跳过零个或多个空⽩字符。
下⾯要特别说⼀下占位符% s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩
字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。
int main()
{
char arr[20] = { 0 };
scanf("%s", arr);//这里没有写&arr,因为数组名arr就是地址
return 0;
}
因为% s 不会包含空⽩字符,所以⽆法⽤来读取多个单词,除⾮多个% s ⼀起使⽤。这也意味着,
scanf() 不适合读取可能包含空格的字符串,⽐如书名或歌曲名。另外, scanf() 遇到% s 占位
符,会在字符串变量末尾存储⼀个空字符 \0 。
int main()
{
char arr1[20] = "xxxxxxxxxxxxxxxxxxxx";
char arr2[20] = "xxxxxxxxxxxxxxxxxxxx";
scanf("%s %s", arr1, arr2);
printf("%s %s\n", arr1, arr2);
return 0;
}
scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串时,
很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使⽤ % s 占位符时,应该指定
读⼊字符串的最⻓⻓度,即写成 % [m]s ,其中的[m] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后
⾯的字符将被丢弃。
int main()
{
char arr[5] = {0};
scanf("%4s", arr);
printf("%s\n", arr); //abcdefg
return 0; //abcd
}
9.2.4赋值忽略符
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);//2024-1-20/2024 1 20/2024/1/20
printf("%d-%d-%d\n", year, month, day);//2024-1-20/2024-0-0 /2024-1-20
return 0;
}
为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression
character)* 。只要把* 加在任何占位符的百分号后⾯,该占位符就不会返回值,
解析后将被丢弃。
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);//2024/1/20
printf("%d-%d-%d\n", year, month, day); //2024-1-20
return 0;
}
上⾯⽰例中,%* c 就是在占位符的百分号后⾯,加⼊了赋值忽略符* ,表⽰这个占位
符没有对应的变量,解读后不必返回。