一:空语句的使用
空语句使用的情况是这里需要一条语句,但语句又不用执行任何事情。
#include <stdio.h>
int main()
{
;//空语句
return 0;
}
二:数据类型
一:浮点型
folat,double,long double,属于浮点型。double比float更精确。
float对应的占位符为%f,double对应的占位符为%ld。
使用浮点型示例:
int main(){
float a = 0.2f;
float b = 0.2;
return 0;
}
第一个浮点型需要加上f是因为,定义float型是时默认结果为double类型,因此加上f,则结果为float类型。浮点型打印出的结果的形式默认为小数点后六位。
二:布尔类型(_Bool或bool)
C 语言原来并没有为布尔值单独设置⼀个类型,而是使用整数 0 表示 假,非零值表示真。
在 C99 中也引入了布尔类型 ,是专门表示真假的。使用布尔类型时,需要调用其库函数<stdbool.h>
示例:
#include <stdio.h>
#include<stdbool.h>
int main()
{
bool a = true;
if (a) //如果正确
{
printf("hehe/n");
}
}
值得一提的是,即便如此,0仍然代表假,非0数代表真。
影响如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int a = 0;
while (scanf("%d", &a) != EOF) {
if (a = 0) {
printf("hehe");
}
else {
printf("haha");
}
}
return 0;
}
无论输入什么数字,其结果都为haha。原因:首先,if语句的条件是赋值(=),而不是判断(==)。因此无论输入什么数字,其最后都为0。于是语句if(a = 0)等价于语句if(0),就代表假,那么就不应该读取假里面的内容,应该读取else里的内容。
若将0换成1,那么结果相反,无论输入什么数,都打印hehe。因为输入的数都会变成1,非0数都为真,那么应该直接执行真里面的语句。
三:各种数据类型的长度
每⼀种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度不同的变量,变量长度的不同,存储的数据范围就有所差异。
一:sizeof操作符
sizeof 是用来计算sizeof的操作符数的类型长度的,单位是字节(byte)。
sizeof 操作符的操作数可以是类型,也可是变量或者表达式。 sizeof (类型)或sizeof 表达式。注意,其中的表达式不会被计算出。
sizeof 的计算结果是 size_t 类型的。因为sizeof返回的类型可能为signed,也可能为unsigned,而unsigned对应printf()的占位符为%u(unsigned int)、%lu(unsigned long)、%llu(unsigned long long)。因此,为了统一,使用占位符%zd。 unsigned见下文signed与unsigned。
#include<stdio.h>
int main()
{
printf("%zd\n",sizeof(int));
return 0;
}
拓展:计算中的单位
1:bit 比特位 刚好储存一个二进制位空间
2:Byte 字节 1Byte = 8bit
3:KB 1KB = 1024(2的10次方)Byte
4:MB 1MB = 1024 KB
5:GB 1GB = 1024 MB
……
二:signed 与 unsigned
signed与unsigned关键字是用于修饰字符型与整数型的。signed表示结果可正可负,unsigned表示结果只为非负数。
int = signed int 但是chat != signed chat
整数变量声明为 unsigned 的好处是,同样长度的内存能够表示的最大整数值,增大了一倍。
四:变量
变量在创建的时候就给⼀个初始值,就叫初始化。 在变量创建好后,再给一个值,这叫赋值。一般情况下,初始化过程最好不要省略。
#include<stdio.h>
int main()
{
int a = 0;//初始化
a = 10;//赋值
printf("%d\n",a);
return 0;
}
五:算数操作符
需要注意的是运算符 /,除号的运算。如果除号前后都是整数,那么输出的结果也是整数(例7/2结果为3)。若需要得到浮点型结果,那么除号前后两部分至少有一部分是小数。
运算符 % 表示求模(余)运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能用于浮点数。负数求模的规则是,结果的正负号由第一个运算数的正负号决定。
#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 = 10;
int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++
printf("a=%d b=%d\n",a , b);
计算口诀:先+1,后使用;
a原来是10,先+1,后a变成了11,再使用就是赋值给b,b得到的也是11,所以计算后, a和b都是11 。
二:后置++
int a = 10;
int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++
printf("a=%d b=%d\n",a , b);
计算口诀:先计算,后+1;
a原来是10,先给b赋值,b就等于10,然后再+1,a就等于11。所以计算后,a = 11,b ==10。
七:强制类型转换
int a = 3.14;
//a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告
为了消除这个警告,我们可以使用强制类型转换:
int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分,不到特不得已,最好不使用强制类型转换,使其自然运行。
八:printf与scanf
一:占位符
占位符,就是这个位置可以用其他值来带入。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int a = 0;
printf("%d与%d相等,都为0", a );//误认为一个a可以直接带入两个%d
return 0;
}
执行结果
printf()与scanf()中的占位符的数量应当比其中的参数少一,不可多于也不可少于。与第一个参数后的参数一一对应。
错误示范:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int a = 0;
printf("%d与%d相等,都为0",a)//误认为一个a可以带入两个%d
return 0;
}
二:限定宽度
一:printf()允许限定最小宽度
#include<stdio.h>
int main(){
printf("%5d",123);//%5d代表打印的数至少为5个,不足部分用空格替代,且向右对齐
return 0; //若超过5个,则不管
}
结果为 123。
二:限定小数数位
#include <stdio.h>
int main()
{
printf("Number is %.2f\n", 0.5);//%.2代表输出结果保留小数点后2位,结果四舍五入
return 0;
}
三:*号代替
以上两种可以同时使用。
#include <stdio.h>
int main()
{
printf("%*.*f\n", 6, 2, 0.5);
return 0;
}
// 等同于printf("%6.2f\n", 0.5);
三:输出部分字符串
// 输出 hello
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello world");
return 0;
}
四:scanf
当读取到scanf时,程序会停下,等待用户从键盘输入。
一:scanf的返回值
二:scanf的特殊储存
此外scanf储存%s时,应该设定读取字符串的长度,否则若超出预定长度虽然会读取,但会报错。
三:赋值忽略符
#include<stdio.h>
int main(){
char arr[5];//[]中的5是预定字符串arr中长度最多为5,而且字符串后自带一个\0
scanf("$4s",arr);//由于scanf没有自动识别长度的功能,所以需要设置%4s,即只读取4个字符
return 0; //如果不设置,当用户输入字符串abcde时,会报错
}
//为了忽略这个影响,我们需加入%*
#include<stdio.h>
int main(){
int a = 0;
int b = 0;
scanf("%a%*%b",&a.&b);//无论用户输入1,2还是1.2
printf("%a %b",a,b);//最后结果都是1 2
return 0;
}