目录
1.数据类型
1.1布尔类型
_Bool
·引入布尔类型专门表示真假,其使用需包含头文件<stdio.h>;
·其取值只能为:true和flase;
例如:
#define bool _Bool
#define false 0
#define true 1
#include<stdio.h>
int main()
{
_Bool flag = true;
if (flag)
printf("i like C\n");
}
2.signed和unsigned
C语言是用signed和unsigned修饰字符型和整型的:
·signed表示此类型有正负;
·unsigned表示此类型无正负,只有零和正整数。
注:1.对于int型默认是有正负的,即int=signed int;
2.对于char型默认是否有正负由当前系统决定。
3.变量
创建变量的语法形式:
data_type name;
| |
| |
数据类型 变量名
例:
int age;
char ch;
初始化:变量创建时就给它一个初值。
例:
int age=18;
char ch='w';
4.变量分类
·全局变量:大括号外定义的变量(使用范围更广);
·局部变量:打括号内定义的变量(使用范围更局限);
注:当全局变量和局部变量同名时局部变量优先使用。
变量的存储:
5.算术操作符:+、-、*、/、%
·+(加)、-(减)、*(乘)、/(除)、%(取余)均为双目操作符。
5.1 /
先看一个例子:
#include <stdio.h>
int main()
{
float x = 6 / 4;
int y = 6 / 4;
printf("%f\n", x); // 输出 1.000000
printf("%d\n", y); // 输出 1
return 0;
}
会发现输出的x
为1.000000
而不是1.500000
这是因为虽然x
是float
类型,但计算x
的式子中被除数6和除数4都是int
型,得到的结果就是1.5舍去小数部分后的值,为1.000000
。
注:如果希望得到浮点数的结果,两个运算数(被除数和除数)必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法。
5.2 %
·%表示求余运算。
注:这个运算符只能⽤于整数(包括字符型,整形与字符型互通),不能⽤于浮点数。
负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定。
例:
#include <stdio.h>
int main()
{
printf("%d\n", 11 % -5); // 1
printf("%d\n",-11 % -5); // -1
printf("%d\n",-11 % 5); // -1
return 0;
}
6.赋值操作符:=和复合赋值
例:
int a = 100;//初始化
a = 200;//赋值,这⾥使⽤的就是赋值操作符
6.1连续赋值
例:
int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左(接合方向)依次赋值的。
6.2复合赋值符
复合赋值符:
+= -=
*= /= %=
>>= <<=
&= |= ^=
a+=3等价于a=a+3;
a*=3等价于a=a*3;(其他复合赋值符同理)
7.单目操作符:++、–、+、-
7.1 ++和–
7.1.1 前置++
口诀:先加1,后使用。
例:
int a = 10;
int b = ++a;//b=a++等价于(a=a+1,b=a)
printf("a=%d b=%d\n",a , b);//a=11,b=11
7.1.2 后置++
口诀:先使用,后加1。
例:
int a = 10;
int b = a++;//b=a++等价于(b=a,a=a+1)
printf("a=%d b=%d\n",a , b);//a=11,b=10
7.1.3 前置–
口诀:先减1,后使用。
例:
int a = 10;
int b = --a;//b=--a等价于(a=a-1,b=a)
printf("a=%d b=%d\n",a , b);//a=9,b=9
7.1.4 后置–
口诀:先使用,后减1。
例:
int a = 10;
int b = a--;//b=a--等价于(b=a,a=a-1)
printf("a=%d b=%d\n",a , b);//a=9,b=10
7.2 +和-
此处的+就是正,-就是负。
8.强制类型转换
语法形式:
(类型)
例:
int a = 3.14;//a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告
可用强制类型转换修改:
int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分;a=3
9.scanf和printf的介绍
9.1 printf
9.1.1基本用法
printf
的作用是将参数文本输出到屏幕上。
例:
#include<stdio.h>
int main()
{
printf("Hello World");
return 0;
}
会在屏幕上打印:hello world
printf
的使用需包含头文件<stdio.h>
。
9.1.2占位符
·printf()
可输出文本中指定的占位符,占位符就是此位置可用其它值代替。
·占位符的第一个字符均为%,第二个字符表示相应的类型,例:%s,%d等。
例:
#include <stdio.h>
int main()
{
printf("This is a %s\n","apple");
return 0;
}
会在屏幕打印:This is a apple
printf()
参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf()
的参数就应该有 n + 1 个。如果参数个数少于对应的占位符, printf()
可能会输出内存中的任意值。
9.1.3占位符列举
• %a :⼗六进制浮点数,字⺟输出为⼩写。
• %A :⼗六进制浮点数,字⺟输出为⼤写。
• %c :字符。
• %d :⼗进制整数。
• %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
• %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
• %i :整数,基本等同于 %d 。
• %f :⼩数(包含 float 类型和 double 类型)。
• %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 类型。
• %% :输出⼀个百分号。
9.1.4输出格式
printf()
可以定制占位符的输出格式。
9.1.4.1
printf()
允许限定占位符的最小宽度。
例:
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 输出为 " 123"
return 0;
}
上⾯⽰例中, %5d 表⽰这个占位符的宽度⾄少为5位。123不满5位,对应的值的前⾯会添加空格。
输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空
格,可以在占位符的 % 的后⾯插⼊⼀个 - 号。
9.1.4.2总显示正负号
一般, printf()
不对正数显⽰ + 号,只对负数显⽰ - 号。如果想让正数也输出 + 号,可
以在占位符的 % 后⾯加⼀个 +,例:%+d,其可保证输出的值总代有符号。
9.1.4.3限定小数位数
例如,希望⼩数点后⾯只保留两位,占位符可以写成 %.2f 。
例:
#include <stdio.h>
int main()
{
printf("Number is %.2f\n", 0.5);//输出”0.50“
return 0;
}
这种写法可结合前面的限定宽度使用。
9.1.4.4输出部分字符串
%s 占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤ %.[m]s 指定输出
的⻓度,其中 [m] 表示输出的⻓度。
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello world");//其只输出”hello“
return 0;
}
9.2 scanf
9.2.1基本用法
scanf()
用于读取键盘输入。
1.scanf()
语法形式与printf()类似:
scanf("%d",&i);
它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致),告诉编译器解读⽤⼾输⼊的数据类型。它的其余参数就是存放⽤⼾输⼊的变量,格式字符串⾥⾯有多少个占位符,就有多少个变量。
注:·变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf()
传递的不是值,⽽是地址,即将变量 i 的地址指向⽤⼾输⼊的值。
·如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加 & 运算符。
2.scanf()
处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。
例:
#include <stdio.h>
int main()
{
int x;
float y;
// ⽤⼾输⼊ " -13.45e12# 0"
scanf("%d", &x);
scanf("%f", &y);
return 0;
}
上例中, 第一个scanf()
读取数据时, %d 占位符会忽略起⾸的空格,从 - 处开始获取数据,读
取到 -13 停下来,即占位符 %d 只会读到 -13 。
第⼆次调⽤ scanf() 时,从上⼀次停⽌解读的地⽅,继续往下读取即从”.“开始读取,所以 %f 会读取到 .45e12 ,这是采⽤科学计数法的浮点数格式。后⾯的#不属于浮点数的有效字符,停止读取。
9.2.2 scanf返回值
·scanf()
的返回值是⼀个整数,表⽰成功读取的变量个数。
·如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF。
例:
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
float f = 0.0f;
int r = scanf("%d %d %f", &a, &b, &f);
printf("a=%d b=%d f=%f\n", a, b, f);
printf("r = %d\n", r);
return 0;
}
输出结果为:
如果输⼊2个数后,按 ctrl+z ,提前结束输⼊:
在vs中按三次ctrl+z才能结束输入,如果⼀个数字都不输⼊,直接按3次 ctrl+z ,输出的r是-1,也就是EOF:
9.2.3占位符
• %c :字符。
• %d :整数。
• %f : float 类型浮点数。
• %lf : double 类型浮点数。
• %Lf : long double 类型浮点数。
• %s :字符串。
• %[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会
停⽌。
1.·在上面的占位符中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符。
2.·对于%s不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。所以,scanf()不适合读取包含空格的字符串。
3.scanf()
将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以为避免产生预料之外的情况,使⽤ %s 占位符时,应该指定读⼊字符串的最⻓⻓度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后⾯的字符将被丢弃。
例:
#include <stdio.h>
int main()
{
char name[11];
scanf("%10s", name);
return 0;
}
此时只会读取前10个字符,多余的字符将被舍弃。
9.2.4赋值忽略符
例:
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
return 0;
}
上⾯⽰例中,如果⽤⼾输⼊ 2020-01-01 ,就会正确解读出年、⽉、⽇。但⽤⼾可能输⼊其他格式,⽐如2020/01/01 ,这种情况下, scanf() 解析数据就会失败。为了避免这种情况, scanf() 提供了⼀个赋值忽略符 * 。只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
return 0;
}