C语言学习笔记二、 数据类型和变量

1.数据类型介绍

1)两种类型:

(一)内置数据类型(本身自带,可以直接使用):

*字符型:‘a’

char--character

*整形:描述整数

int 整形

short 短整型

long 长整形

long long 更长的整形

*浮点型:描述小数

float单精度浮点型

double双精度浮点型

long double

*布尔类型:专门用来描述真和假的类型

-Bool  bool

布尔类型的使用得包含头文件stdbool.h

布尔类型变量的取值只能是true或者false

(二)自定义类型:略

2)数据类型的长度

*size of 操作符 也是关键字,单位是字节

--求一个·数据类型的长度:printf("%zd\n",size of(char)) 1

--求一个整形的长度:如int a=10

可以写printf("%zd\n",sizeof a)或printf("%zd\n",sizeof(a))或printf("%zd\n",size of(int))

*补充---计算机中常见的单位:bit:存储一个二进制位所需要的空间就是一个bit位

                                           Byte=一个字节=八个bit位

                                           KB=1024Byte

                                           MB=1024KB

                                           GB=1024MB

                                           TB、PB ......                                   

2.signed和unsigned

c语言用这俩个关键字来修饰字符型和整形的

*signed关键字修饰的一个变量带有正负号

*unsigned关键字修饰的变量没有正负号,只能修饰零和正整数

*int默认有符号,它等价于signed int

*无符号的整形:unsigned int

*unsigned的好处:同样的内存能表示的最大整数值增大了一倍

*char不等于signed char,char有没有符号是由编译器决定的

*%d打印有符号的整数

  %u打印无符号的整形

  %lu打印无符号的长整型

  %llu打印无符号的长长整形unsigned long long int

*size of的返回类型是size_t类型的

size_t n=sizeof(int)

printf("%zd\n",n)

3.数据类型的取值范围

limits.h

float.h

4.变量

1)变量的创建

数据类型是用来创建变量的

*C语言把经常变化的值称为变量,不变的值称为常量

*创建变量的语法形式:数据类型+变量名字

                                   date_type name(变量名字自己编)

*补充:变量名字尽量起的有意义;变量名的组成只能是数字、字母、下划线且不能数字开头;变量名不能是关键字。

*变量在创建的时候给一个初始值就叫初始化

2)变量的分类:全局变量和局部变量

大括号外面的变量就是全局变量

大括号里面的变量就是局部变量

*当全局和局部变量名字冲突时,局部优先

*全局和局部变量在内存中存储在哪里呢?

我们创建变量的本质时在内存中申请了一块空间

内存中有三个区域;栈区、堆区、静态区

全局变量在静态区,局部变量在栈区,(堆区是用来动态内存管理的)

5.算术操作符+ - * / %

双目操作符:有两个操作数的操作符

1)/除号

除号的两端如果都是整数,执行的是整数除法,结果取整;

#include<stdio.h>

intmain()

{

floatx =6/4;

inty =6/4;

printf("%f\n", x);        //输出1.000000

printf("%d\n", y);       //输出1

return0;

}

如果要计算出小数的效果,那么除号的两端至少有一个数得是浮点数(用%lf打印)

#include<stdio.h>

intmain()

{

floatx =6.0/4;      //或者写成6 / 4.0

printf("%f\n", x);     //输出1.500000

return0;

}

%f和%lf默认结果是六位小数,如果想要一位小数,改为%.1lf

#include<stdio.h>

intmain()

{

intscore =5;                           

score = (score /20) *100;

return0;

}

这串代码的运行结果是0,因为5/20整除后的结果是0,乘上100也是0

想要得到预想的结果,只需要把除号右边的数改成浮点数,这样得出的结果就是25

intscore =5;

score = (score /20.0) *100;

return0;

2)%取余

*返回两个整数相除的余数。这个运算符只能应用于整数

*负数也可以取余,但是结果的正负号取决于左操作数的正负号

6.赋值操作符=

*初始化不是赋值

int a=10; 初始化

a=5; 赋值

*连续赋值 如c=b=a+3,从右往左赋(支持但是不推荐)

==复合赋值符==

int a=10

a=a+4

可以写成a+=4

7.单目操作符

只有一个操作数

1)++自增操作符,分为前置++和后置++,且都是加一

前置++(++a):先加一,后使用

int a =5;

int b =++a;

printf("a=%d b=%d\n",a,b);

这样的结果是6 6 

后置++(a++):先使用,后加一

int a =5;

int b =a++;

printf("a=%d b=%d\n",a,b);

这里a先赋值给b后再加一,结果应该是5 6

--自减操作符:也分为后置--和前置--,和·++同理

int a=5

prntf("%d",a--)

这里的结果是5

2)正号和负号+-

运算符+对正负值没有影响,完全可以省略

运算符-用来改变一个值的正负号,负数前面加-得正数,正数前面加-得负数

8.强制类型转换

实在万不得已的时候使用

如int a =(int)3.14 ,打印a得到3

注释:·直接写出的字面浮点数,会被编译器直接识别为double类型,如果想改为float,可以直接在浮点数后面加上f (3.14f)

入过一个浮点数的数字比较小,用float,比较大用double

9.scanf和printf的介绍

9.1printf:按照制定的格式打印数据(f:format)

1)关于printf:

*报错误:无法解析嗯外部符号--忘记包含头文件了

*换行效果:在输出文本末尾加\n,让光标移到下一行的开头

*它是库函数,使用前必须在源码文件头部引入头文件stdio.h

2)占位符:

*printf可以在输出文本中指定占位符,即这个位置可以用其他值代入

*占位符第一个字符都是%,第二个字符表示占位符的类型

*一个文本可以有多个占位符

int main()

{

printf("%s says it is %d o'clock\n","wangwu",21);

return 0;

}

注意:参数与占位符是一一对应的关系

*占位符列举:

%c 字符

%s 字符串

%a 十六进制浮点数

%d 十进制整数

%f 小数。//float %f ,double %lf

%hd 十进制短整型short int

%ld 十进制长整型long int

%lu unsigned long int类型

%指针

%u 无符号整数unsigned int

%zd size_t类型(size of的返回类型)

% %输出一个%

3)输出格式:printf()可以定制占位符的输出格式

*限定宽度%xd   

示例:%5d (最少)打印五个字符

输出的值默认是右对齐,即如果在%5d中输入123,得到的结果是"(空格)(空格)123”;如果想要改成左对齐,可以在%后面加一个负号(%-5),这样得到的结果就是123(空格)(空格)

对于小数,这个限定符会限制所有数字的最小显示宽度。

示例:%12f 如果输入123.45这个数,由于小数的默认显示精度是小数点后六位,所以输出结果的头部会加两个空格

*总是显示正负号

默认printf不对正数显示+号,只对负数显示-号。如果想要正数显示+号,就写成:%+d

*限定小数位数

如果希望小数点后面只保留两位,占位符可以写成%.2f

这种写法可以与限定宽度占位符结合使用

//输出为"   0.50"    数前面有两个空格

#include<stdio.h>

intmain()

{

printf("%6.2f\n",0.5);

return0;

}

*输出部分字符串

%s占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤%.[m]s指定输出

的⻓度,其中[m]代表⼀个数字,表⽰所要输出的⻓度。

占位符%.5s表⽰只输出字符串“hello world”的前5个字符,即“hello”。

9.2scanf输入函数

int main()

{

int score=0

printf("请输入成绩');

scanf("%d",&score);    //&是取地址符号

printf("成绩是:%d\n",score);

return 0

}

1)基本用法:scanf函数用于读取用户的键盘操作

程序运行到这个语句时就会停下来等待用户的键盘输入,用户输入后按下回车,scanf就会处理用户的输入,将其存入变量

scanf("%d",&i)

scanf()必须提前知道用户输入的数据类型才能处理数据,其余参数就是存放用户输入的变量,格式字符串里有多少个占位符就有多少个变量

int main()

{

int i=0;

int j=0;

float x=0.0f;

float y=0.0f;

scanf("%d%d%f%f",&i,&j,&x,&y);

printf("i=%d\n",i);

printf("j=%d\n",j);

printf("x=%d\n",x);

printf("y=%d\n",y);

return 0

}

-注意输入数据的时候要用空格断开,一个或多个都可以

-scanf处理用户数据的原理:用户的输入先放人缓存,等到按下回车键后,按照占位符对缓存进行解读。

解读时,会从上一次解读遗留的第一个字开始,到读完或者遇到第一个不符合条件的字为止

2)scanf()的返回值是一个整数,表示成功读取的变量的个数

如果没有读取任何项\匹配失败,则返回0

如果在成功读取任何数据之前,发生了读取错误或读到文件末尾,则返回EOF(-1)

#include<stdio.h>

intmain()

{

inta =0;

intb =0;

floatf =0.0f;

intr =scanf("%d %d %f", &a, &b, &f);

printf("a=%d b=%d f=%f\n", a, b, f);

printf("r = %d\n", r);

return0;

scanf的返回值的理解很有用

在OJ的刷题中,有多组输入场景的时候,可能会用到

(OJ:online jugde网页上写代码,网页上提交)

现在出去找工作的时候,笔试基本上都是在线OJ,所以要熟悉OJ做题的方式

3)占位符(与printf的基本一致)

%c

%d

%f

%lf: double

%Lf: long double

注意:除了%c以外,其他的占位符都会自动忽略空格

如果要强制跳过字符前的空白字符,只需要在%c的前面加上一个空格,即跳过一个或多个空白字符

*特别说明一下%s,他不能简单的等同于字符串。它的规则是,从第一个非空白字符开始,知道遇到空白字符(空格,换行符,制表符等)为止,这意味着scanf不适合用来读取多个单词

另外,scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0

scanf将字符串读入字符数组时,不会检测字符串是否超过数组长度,从而储存字符串时会可能会超过数组边界,从而出现错误。

因此,使用%S时,应该指定输入字符串的最长长度,即写成%[m]s,其中[m]是一个整数,表示读取字符串的最大长度,后面的字符应该被丢弃

int main()

{

 char arr[11]={0};

scanf("%s",arr);     (这里没有写&arr,因为数组名arr就是地址)

printf("%s",arr);

return 0

}

4)scanf函数在VS上的报错:

VS说scanf函数不安全,建议使用scanf_s

但初学时不建议使用scanf_s,因为它VS2022提供的,其他的编译器不认识,降低了代码的可移植性

解决办法:只要在使用scanf函数的.c文件的第一行加上:#define _CRT_SECURE_NO_WARNINGS 1

一劳永逸:在VS上新建.c\.cpp文件的时候,拷贝的是一个固定文件:newc++file.cpp

只要在这个文件中加上就一劳永逸了

赋值忽略符

有时候,用户的输入可能不符合预订的格式

#include<stdio.h>

intmain()

{

intyear =0;

intmonth =0;

intday =0;

scanf("%d-%d-%d", &year, &month, &day);

printf("%d %d %d\n", year, month, day);

return0;

上⾯⽰例中,如果⽤⼾输⼊2020-01-01,就会正确解读出年、⽉、⽇。问题是⽤⼾可能输⼊其他

格式,⽐如2020/01/01,这种情况下,scanf()解析数据就会失败。

为了避免这种情况,scanf()提供了⼀个赋值忽略符*。

只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。

#include<stdio.h>

intmain()

{

intyear =0;

intmonth =0;

intday =0;

scanf("%d% * c%d% * c%d", &year, &month, &day);

printf("%d-%d-%d",year,month,day);

return0;

}

这时,不管输入2023 12 21还是2023/12/21,都可以正确的输出2023-12-21

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值