数据类型介绍
数据类型分为:内置类型和自定义类型
内置类型
代码语言:javascript复制char //character字符
[signed] char //有符号的
unsigned char //无符号的
代码语言:javascript复制short --短整型//shortr [int] int可以省略
int --整型
long --长整型
long long --更长的整型
代码语言:javascript复制float --单精度浮点型
double --双精度浮点型
代码语言:javascript复制表示真/假的变量Bool
布尔类型的使用需要包含头文件<stdbool.h>
布尔变量的取值是:ture false,0表示假,非0表示真
数据类型长度(sizeof)
代码语言:javascript复制#include <stdio.h>
int main()
{
printf("%zdn",sizeof(float));
return 0;
}
#include <stdio.h>
int main()
{
int a = 10;
printf("%zdn",sizeof (a));
return 0;
}
输出结果我为4,因为a=10,而10是整型,整型的长度为4
zizeof后面的括号里面如果放的是表达式,表达式不会真实计算
#include <stdio.h>
int main()
{
short s = 2;
int b = 10;
printf("%zdn",sizeof (s = b 1));
printf("s = %dn",s);
return 0;
}
输出结果是:2
s = 2
对于第37行,b是整型,1也是整型,所以b 1的结果也是整型,但是代码要求打印所以一切根据s来说,,s是一个short类型,长度为2,所以代码输出结果为2,37行的表达式是不会真实计算的
c语言标准规定:sizeof(long)≥sizeof(int)
signed和unsigned
signed关键字,表示一个类型带有正负号,包含负值
unsiged关键字,表示该类型不带有正负号,只能表示0和正整数
代码语言:javascript复制signed int unm = 100;//signed int --有符号的int
unsigned int = 100;//无符号的int
char是否有符号取决于编译器的实现,大部分的编译器上 char = signed char
int = signed int -----有符号的int
以后在编程中要写无符号的int,就写unsigned int
代码语言:javascript复制//对于有符号的整数打印应该使用%d,即带有负号的
//对于无符号的整数打印应该使用%u
#include <stdio.h>
int main()
{
int num = -100;
printf("%dn",num);
return 0;
}
涉及到有数字的打印,我们应该考虑数字的符号问题,是否带有正负号
除法/
除号的两端如果是整数,执行的是整数除法,得到的结果也是整数
代码语言:javascript复制#include <stdio.h>
int main()
{
printf("%dn", 10 / 4);
return 0;
}
运行结果是2
只要有一个数是小数,则程序执行的就是小数除法
#include <stdio.h>
int main()
{
printf("%fn", 10 / 4.0);
return 0;
}
运算结果为2.500000
,一定要将%d换成%f,不然会报错
取余%
运算符%表示取余,即返回两个整数相除的余值,这个运算符只能用于整数,不能用于浮点数
代码语言:javascript复制#include <stdio.h>
int main()
{
printf("%dn", 9 % 4);
return 0;
}
结果为1
代码语言:javascript复制#include <stdio.h>
int main()
{
printf("%dn", 11 % -5);
printf("%dn", -11 % -5);
printf("%dn", -11 % 5);
return 0;
}
结果为1 -1 -1
原因:负数取余的规则是,结果的正负号是由第一个运算数的正负号决定的
负数取余的规则:负数取余的规则是,结果的正负号是由第一个运算数的正负号决定的
除号两边只要有一个是小数,就执行小数除法 ,%操作符的操作数只能是整数
%操作符计算的结果是两个操作数整除之后的余数
单目操作符: 、--、 、-连续赋值和复合赋值
代码语言:javascript复制int a = 3;
int b = 5;
int c = 0;
c = b = a ;3 //连续赋值,从左到右依次赋值的
更方便的一种复制方法:
int a = 3;
int b = 5;
int c = 0;
b = a 3;
c = b;
代码语言:javascript复制int a = 0;//初始化
a = a 10;
a = 10;//复合赋值
前置
代码语言:javascript复制int a = 5;
int b = a;//先 ,后使用,a=a 1,b=a
后置
代码语言:javascript复制int a = 5;
int b = a ;//先将a带入b中,再 ,b=a,a=a 1
#include <stdio.h>
int main()
{
int a = 10;
int b = a--;
printf("a = %dn",a);//a=9
printf("b = %dn",b);//b=10
return 0;
}
前置--
#include <stdio.h>
int main()
{
int a = 10;
int b = --a;先减一再带入到b
printf("a = %dn",a);//a=9
printf("b = %dn",b);//b=9
return 0;
}
#include <stdio.h>
int main()
{
int a = 5;
printf("%dn",a--);//5
printf("%dn",a);//4
return 0;
}
题目:
#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = a;// a:加给a 1,结果为6,用加完之后的结果给c赋值,因此:a = 6 c = 6
b = c, c , a, a ;
// 这里先算b= c, b得到的是 c后的结果,b是7
// b= c 和后边的整体构成逗号表达式,依次从左向右计算的。
// 表达式结束时,c 和, a,a 会给a 2,给c加1,此时c:8,a:8,b:7
b = a c; // a先和c加,结果为16,在加上b的值7,比的结果为23,最后给a加1,a的值为9
printf("a = %d b = %d c = %dn:", a, b, c); // a:9, b:23, c:8
return 0;
a,a先加,再带入到c
b= c,c , a,a
依次执行
先 c,然后c=7,再带入到b,b=7
c 是单独的,c=8
a,a 1=7
a .单独计算,a 1=8
b = a c
对其展开:
原式=b = b (a c)//该式子未改变c,所以c仍然为8
b=7 (a c),因为此处的a 是后置a ,所以先取a的值,再
b=7 (a 8);a
b=7 (8 8)a
再执行a ,前面a 是8,所以此处为a=9
b=7 16=23
b= a,就是先a 1,再把 1后的结果带到b里面
a先带进去,再自己 , 先带后加
int b = a //先把a的值赋值到b上面,再a自己 1,b就不参与了,因为已经被a 赋值了,
a先 上,再带进去,先 后带
int b = a //先a自己 1进行计算,再把计算后的a带入到b的值里面
强制类型转换
代码语言:javascript复制#include <stdio.h>
int main()
{
int a =(int)3.14;//3.14属于double类型,在前面添加括号int 即可实现强制转换
printf("%dn",a);
return 0;
}
实现强制类型转换是万不得已的情况下使用
scanf和printf介绍
printf=printf format,按照一个格式来打印,
除了%c以外,都会自动忽略起首的空白字符,
scanf的占位符遇到空格会停止读取的
代码语言:javascript复制printf("%dn",100); //这其中的%d就是占位符
printf("There are %d applen",3);
printf("%s says it is %d o'clock","kai",10);
printf()有n个占位符就应该有n 1个参数,拿第三行举例,"kai"和10算两个参数,对于printf(),"%s says it is %d o'clock"也算一个参数。
printf("]n",11234)// ]调整数据的长度
]这个占位符的宽度至少为5位如果不满5位,对应的前面会添加空格,如果满足5位甚至大于5位,则原样输出
%f
%lf 在打印时,小数点后默认6位
#include <stdio.h>
int main()
{
printf("%-5dn",123);//在%和d中间添加-n可以让输出结果在位数不够凑的情况下,补足输出结果前面的空格
return 0;
}
总是显示正负号:在%d之间加上 号
若要让输出结果显示正负号,需要在%和d之间添加 号,仅仅在后面的数字前面加 号是不会显示的
#include <stdio.h>
int main()
{
printf("% dn",123);
printf("%dn",-123);
return 0;
}
printf("%5.5fn", 123.4);//调整小数点后面的位数
printf("%*.*fn",6,5,1.526);//通过*号和参数的配合,让*号给后面的数据占位
printf("%.3sn","abcdef");//若想要使输出字符串控制在前三位,只打印前三位,在%和s之间输入.n即可调整打印的位数
代码语言:javascript复制#include <stdio.h>
int main()
{
int score = 0;//输入score这个容器,现在是容量是0
printf("请输入成绩:"); //引导我们输入值
scanf("%d",&score); //输入的值导入到score中,score的含量变为你输入的值的大小,&符号是取地址的符号,取score这个地址
printf("成绩是:%dn",score); 再将score中的值打印出来
return 0;
}
程序运行到scanf时就停下来,等待用户输入数值,输完数据才能往下走
scanf()的第一个参数是格式化占位符,基本占位跟printf一样
scanf("%d",&i),告诉编译器如何解读用户的输入,需要提取的数据是什么类型
因为c语言是有格式类型的,sanf必须提前知道用户输入的数据类型,才能处理数据
scanf()函数中一定要添加&去取地址
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
float c = 0.0;
float d = 0.0;
scanf_s("%d %d %f %f", &a,&b,&c,&d);
printf("%d %d %f %f", a,b,c,d);
return 0;
}
在scanf()中一定要添加取地址符号&,不然不能将数据存储在变量中
scanf()在处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符
查询返回值:
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int ret = scanf("%d %d %d %d", &a, &b, &c, &d);
printf("a=%d b=%d c=%d d=%dn", a, b, c, d);
printf("ret=%dn", ret);
return
除了%c以外,都会自动忽略起首的空白字符,
强制跳过空白字符
如果在%c前面加空格,则会主动跳过你输入的空格信息,然后直接读取真正的字符
scanf(" %c",&i)
char ch = 0;
scanf_s(" %c", &ch);
printf("xxxx%cyyyyn", ch);
代码语言:javascript复制vs提示:scanf函数不安全,考虑用scanf_s来替换
scanf和scanf_s的使用方法不完全相同
如果让错误信息失效的话,请使用_CRT_SECURE_NO_WARNINGS
要用#define定义这个函数
#define _CRT_SECURE_NO_WARNINGS 1,
使用everything搜索newc
赋值忽略符:为了避免你给的格式和scanf中的格式是不一样而导致结果出错,赋值忽略符起到作用
只要把*号加在任意占位符的百分号后面,该符号就不会返回值,解析后将被丢弃
代码语言:javascript复制int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
printf("%d %d %dn", year, month, day)
输入2024-5-14
输出2024 5 14
若输入2024/5/16 则输出2024 0 0,则数据就错了
将第4行改成以下:
scanf("%d%*c%d%*c%d", &year, &month, &day);
在%d与%d之间添加%*c,这里的%*c就是赋值忽略符
输入2024/5/15 输出2024 5 15
斜杠就被忽略掉了,斜杠算一个字符,与%c配对,在配对后会被省略
只要数值给对了,格式都无所谓的