C语言数据类型和变量
数据类型介绍
类型:相似的数据所拥有的共同特征
数据类型分为内置类型和自定义类型
内置类型是C语言本身具有的,自定义类型是自己创造的
字符型
char //character
[signed] char //有符号的
[unsigned] char//⽆符号的
整型
short [int]//短整型
int//整型
long [int]//⻓整型
long long [int]//更⻓的整型、
//带[int]可以忽略
浮点型
float//单精度浮点型
double //双精度浮点型
long double//更高的精度
布尔类型
表示真假的变量——布尔值_Bool / bool
C语言中规定:0表示假,非0表示真
布尔类型的使用得包含头文件 <stdbool.h>
布尔类型变量的取值是: true 或者 false
各种数据类型的长度
sizeof 操作符
sizeof是一个关键字,也叫操作符,⽤来计算sizeof的操作符数的类型⻓度,
单位是字节(Byte),比特位(bit)
1个2进制位的存储需要1个bit位的空间
> 1Byte= 8bit 1KB = 1024Byte
> 1GB = 1024KB 1TB = 1024G
> 1PB = 1024TB 1024 = 2^10
sizeof 操作符的操作数可以是类型,也可是变量或者表达式
sizeof 表达式
sizeof(类型)
sizeof 的操作数是变量的时候,可以省略掉后边的括号的。
#include <stdio.h>
int main()
{
int a = 2;
printf("%zd\n", sizeof a);
printf("%zd\n", sizeof (int));
printf("%zd\n", sizeof (5 + 6))//表达式不可以省略括号
return 0;
}
sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出大小。
#include<stdio.h>
int main()
{
short a = 5;
int b = 3;
printf("%zd\n", sizeof(b = a + 5));
printf("%d\n", b);
return 0;
}
sizeof的返回值是无符号的整数,sizeof 的计算结果是 size_t 类型的,占位符用 “%zd“ 来打印
常见的一些类型长度:
C语言标准规定:sizeof (long) >=sizeof (int)
signed 和 unsigned
signed 关键字,表示⼀个类型带有正负号,包含负值;
unsigned 关键字,表示该类型不带有正负号,只能表示零和正整数。
int类型
signed int a; //同于int a;
unsigned int a;//int可省略,等同于unsigned a;
//对于有符号的整数打印应该使用%d,即带有负号的
//对于无符号的整数打印应该使用%u
#include <stdio.h>
int main()
{
int num = -10;
unsigned int num1 = 50
printf("%d\n", num);
printf("%u\n", num1):
return 0;
}
char类型
char是否有符号取决于编译器的实现,大部分的编译器上 char = signed char。
signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255
变量
了解清楚了类型,我们使用类型做什么呢?类型是用来创建变量的。
什么是变量呢?
C语言中把经常变化的值称为变量,不变的值称为常量。
局部变量不初始化的时候,他的值是随机的
全局变量如果不初始化,默认值是0
scanf 和 printf 介绍
printf
printf中的f 代表 format (格式化)换行符 \n
#include<stdio.h>
int main()
{
printf("hello world\n");//\n换行符
printf("abc\ndef");
return 0;
}
占位符
这个位置可以用其他值代入,叫占位符
#include<stdio.h>
int main()
{
printf("num = %d\n", 100);//1. 占位符的第⼀个字符⼀律为百分号 % 2.第⼆个字符表⽰占位符的类型 ,例如%d
printf("%s will come tonight\n", "zhangsan");
printf("%s says this is %d o'clock\n", "cuiha", 14);//输出⽂本⾥⾯可以使⽤多个占位符
return 0;
}
如果有 n 个占位符, printf() 的参数就应该有 n +1 个。
如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值
常见的占位符举例:
%s---字符串 %d---int 类型 %hd---short int 类型
%c---字符 %u---unsigned int 类型 %hu---unsigned short int 类型
%f---float 类型 %Lf---long double 类型 %ld---long int 类型
%lf--double 类型 %lu---unsigned long int 类型
%p---(指针⽤来打印地址) %o---八进制整数 %%---输出⼀个百分号
%x---十六进制整数 %zd---size_t类型
printf() 可以定制占位符的输出格式
printf() 允许限定占位符的最小宽度
#include<stdio.h>
int main()
{
//%5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格
printf("%5d\n", 123);//输出为" 123"
return 0;
}
输出的值默认是右对齐,如果想要左对齐,在%后面加 - 号
//右对齐
#include<stdio.h>
int main()
{
printf("%5d\n", 123);
printf("%5s\n", "hehe");
printf("%d\n", 12345);
return 0;
}
//左对齐
#include<stdio.h>
int main()
{
printf("%-5d\n", 123);
printf("%-5s\n", "hehe");
printf("%-d\n", 12345);
return 0;
}
总是显示正负号
默认情况下, printf() 不对正数显示 + 号,只对负数显示 - 号。如果想让正数也输出 + 号,可
以在占位符的 % 后面加⼀个 +
#include<stdio.h>
int main()
{
printf("%+d\n", 55);//输出为"+55"
printf("%+d\n", -55);//对负数不影响,输出为"-55"
return 0;
}
限定小数位数
输出小数时,可以限定小数的位数。%.[m]f,其中[m],是你想要限定小数的位数
#include<stdio.h>
int main()
{
printf("%.3f", 3.1415);//输出为"3.142",限定3位小数,计算机会帮我们四舍五入
return 0;
}
这种写法可以与限定宽度占位符,结合使用,举个简单的例子:
//限定占位符的最小宽度为6位,小数点包含在内,且限制小数点后两位
#include<stdio.h>
int main()
{
printf("%6.2f\n", 2.1452);//输出为"2.15"
return 0;
}
最小宽度和小数位数这两个限定值,都可以用 * 代替,通过 printf() 的参数传入。
#include<stdio.h>
int main()
{
printf("%*.*f\n", 6, 2, 2.1452);//输出为" 2.15"
return 0;
}//等同于 printf("%6.2f\n", 2.1452);
输出部分字符串
可以用 %.[m]s 指定输出的长度,其中 [m] 代表⼀个数字,表示所要输出的长度。
#include<stdio.h>
int main()
{
printf("%.5s\n", "hello c");//输出为 "hello"
return 0;
}
scanf
给变量输入值可以使用 scanf 函数,再用printf函数输出,举个例子
#include <stdio.h>
int main()
{
int score = 0;在vs上会出现
printf("请输入成绩:");
scanf("%d", &score);
printf("成绩是:%d\n", score);
return 0;
}
在vs上会出现报错的情况,解决方法如下:
1.下载everthing搜索软件
2.在everything上搜索 newc + + file.cpp ,注意
如果在你所在的 newc++file 这个文件路径中需要权限,则把它剪切到桌面上进行上述操作后再将它剪切回到原来的路径即可,这里注意关掉VS后再次打开VS需要创建新的项目以及 .c文件才可以使用scanf函数
scanf基本用法
scanf("%d", &i);//其余参数存放用户输⼊的变量,&-->取地址操作符
第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致),
告诉编译器如何解读用户的输⼊,需要提取的数据是什么类型。
这是因为 C 语⾔的数据都是有类型的, scanf() 必须提前知道用户输⼊的数据类型,才能处理数据。
格式字符串⾥⾯有多少个占位符,就有多少个变量。
注意:scanf() 传递的是地址,变量前面必须加上 & 运算符(指针变量除外)
scanf可以输入多个变量
scanf() 处理数值占位符时,会⾃动过滤空白字符,包括空格、制表符、换行符等。
将输入分成几行,也不影响scanf函数解读
#include<stdio.h>
int main()
{
int a = 0;
short b = 0;
unsigned int c = 0;
float d = 0.0f;
scanf("%d %hd %u %f", &a, &b, &c, &d);//注意这里只需要一个双引号,下面也是
printf("a = %d b = %hd c = %u d = %f\n", a, b, c, d);//\n记得加上
//scanf("%d" "%hd" "%u" "%f", &a, &b, &c, &d);//这是前面打印不合理的两串代码
//printf("a = %d" "b = %hd" "c = %u" "d = %f\n", a, b, c, d);
return 0;
}
scanf函数解读原理:
解读用户输入时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符条件的字符为止。
#include <stdio.h>
int main()
{
int a = 0;
float b = 0.0f;//记得初始化0.0f
scanf("%d %f", &a, &b);// 用户输入 " -13.45e12# 0"
printf("%d %f\n", a, b);// 输出-13
//输出449999994880.000000,数值太大了,打印是不能够精确打印的
//遇到#号停止打印,e为科学计数法
return 0;
}
scanf的返回值
1.表示成功读取几个变量就返回成功读取的个数
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
float c = 0.0f;
int ret = scanf("%d %d %f", &a, &b, &c);//用户输入"100 155 2.1515"
printf("a = %d b = %d c = %f\n", a, b, c);
printf("ret = %d\n", ret);//打印出来的是3,表明成功读取到3个变量
return 0;
}
2.没有读取数据或匹配失败,则返回 0 。(可以理解为读取到0个数据)
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
float c = 0.0f;
int ret = scanf("%d %d %f", &a, &b, &c);//用户输入" hello"
printf("a = %d b = %d c = %f\n", a, b, c);
printf("ret = %d\n", ret);//打印出来的是"ret = 0",表明成功读取到0个变量
return 0;
}
3.如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量 EOF (-1)。 EOF - end of file ⽂件结束标志
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
float c = 0.0f;
int ret = scanf("%d %d %f", &a, &b, &c);//用户输入"三次Ctrl+Z",并且每输入一次按下Enter键才会生效
printf("a = %d b = %d c = %f\n", a, b, c);
printf("ret = %d\n", ret);//打印出来的是"ret = -1",等同于EOF (-1)
return 0;
}
在VS环境中如果想要提前想要结束读取可以使用三次”Ctrl+Z",并且每输入一次按下Enter键才会生效,
即可提前结束读取
占位符
%c :字符。
%d :整数。
%f : float 类型浮点数。
%lf : double 类型浮点数。
%Lf :long double 类型浮点数。
%s :字符串。
%[] :在方括号中指定⼀组匹配的字符(比如 %[0-9]),遇到不在集合之中的字符,匹配将会停止
除了 %c 以外,都会自动忽略起首的空白字符。
%c 不忽略空白字符,总是返回当前第⼀个字符,无论该字符是否为空格。
#include<stdio.h>
int main()
{
char ch = 0;
scanf("%c", &ch);//输入" h"
printf("xxx%cyyy\n", ch);//输出"xxx yyy"
return 0;
}
//如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,
//表示跳过零个或多个空⽩字符。
#include<stdio.h>
int main()
{
char ch = 0;
scanf(" %c", &ch);//输入" hello"
printf("%c\n", ch);//输出"h"
return 0;
}
占位符%s 规则:从当前第⼀个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。
#include<stdio.h>
int main()
{
char arr[20] = { 0 };
scanf("%s", arr);//输入"hello world",arr是数组名,数组名是地址
printf("%s\n", arr);//输出"hello"
return 0;
}
// %s 无法⽤来读取多个单词,除⾮使用多个 %s ⼀起使⽤。scanf() 不适合读取包含空格的字符串,⽐如书名或歌曲名。
#include<stdio.h>
int main()
{
char arr1[20] = { 0 };
char arr2[20] = { 0 };
scanf("%s %s", arr1, arr2);//输入"hello world"
printf("%s %s\n", arr1, arr2);//输出"hello world"
return 0;
}
scanf() 遇到 %s 占位符,会在字符串变量末尾存储⼀个空字符 \0 。
打印的结果:
scanf() 将字符串读入字符数组时,不会检测字符串是否超过了数组长度。
为了防止这种情况即写成 %[m]s ,其中的 [m] 是⼀个整数
#include<stdio.h>
int main()
{
char arr[15] = { 0 };
scanf("%10s", arr);//输入"abcdefghjkl"
printf("%s\n", arr);//输出"abcdefghjk"
return 0;
}