_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");
}
C语言是用signed和unsigned修饰字符型和整型的:
·signed表示此类型有正负;
·unsigned表示此类型无正负,只有零和正整数。
注:1.对于int型默认是有正负的,即int=signed int;
2.对于char型默认是否有正负由当前系统决定。
创建变量的语法形式:
data_type name;
| |
| |
数据类型 变量名
例:
int age;
char ch;
初始化:变量创建时就给它一个初值。
例:
int age=18;
char ch='w';
·全局变量:大括号外定义的变量(使用范围更广);
·局部变量:打括号内定义的变量(使用范围更局限);
注:当全局变量和局部变量同名时局部变量优先使用。
变量的存储:
·+(加)、-(减)、*(乘)、/(除)、%(取余)均为双目操作符。
先看一个例子:
#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 语?就会进?浮点数除法。
·%表示求余运算。
注:这个运算符只能?于整数(包括字符型,整形与字符型互通),不能?于浮点数。
负数求模的规则是,结果的正负号由第?个运算数的正负号决定。
例:
#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;
}
例:
int a = 100;//初始化
a = 200;//赋值,这?使?的就是赋值操作符
例:
int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左(接合方向)依次赋值的。
复合赋值符:
+= -=
*= /= %=
>>= <<=
&= |= ^=
a+=3等价于a=a+3;
a*=3等价于a=a*3;(其他复合赋值符同理)
口诀:先加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
口诀:先使用,后加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
口诀:先减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
口诀:先使用,后减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
此处的+就是正,-就是负。
语法形式:
(类型)
例:
int a = 3.14;//a的是int类型, 3.14是double类型,两边的类型不?致,编译器会报警告
可用强制类型转换修改:
int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分;a=3
printf
的作用是将参数文本输出到屏幕上。
例:
#include<stdio.h>
int main()
{
printf("Hello World");
return 0;
}
会在屏幕上打印:hello world
printf
的使用需包含头文件<stdio.h>
。
·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()
可能会输出内存中的任意值。
? %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 类型。
? %% :输出?个百分号。
printf()
可以定制占位符的输出格式。
printf()
允许限定占位符的最小宽度。
例:
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 输出为 " 123"
return 0;
}
上??例中, %5d 表?这个占位符的宽度?少为5位。123不满5位,对应的值的前?会添加空格。
输出的值默认是右对?,即输出内容前?会有空格;如果希望改成左对?,在输出内容后?添加空
格,可以在占位符的 % 的后?插??个 - 号。
一般, printf()
不对正数显? + 号,只对负数显? - 号。如果想让正数也输出 + 号,可
以在占位符的 % 后?加?个 +,例:%+d,其可保证输出的值总代有符号。
例如,希望?数点后?只保留两位,占位符可以写成 %.2f 。
例:
#include <stdio.h>
int main()
{
printf("Number is %.2f\n", 0.5);//输出”0.50“
return 0;
}
这种写法可结合前面的限定宽度使用。
%s 占位符?来输出字符串,默认是全部输出。如果只想输出开头的部分,可以? %.[m]s 指定输出
的?度,其中 [m] 表示输出的?度。
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello world");//其只输出”hello“
return 0;
}
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 ,这是采?科学计数法的浮点数格式。后?的#不属于浮点数的有效字符,停止读取。
·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:
? %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个字符,多余的字符将被舍弃。
例:
#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;
}