首页 > 其他分享 >[C语言学习]--数据类型和变量

[C语言学习]--数据类型和变量

时间:2024-07-07 21:56:02浏览次数:16  
标签:-- 数据类型 unsigned C语言 int printf 类型 sizeof

文章目录

前言

一、数据类型介绍

1.内置类型

1.1.整型

1.2.浮点型

1.3.字符型

1.4.布尔类型

2.自定义类型 

3.数据类型的长度

4.sizeof操作符 

5.signed和unsigned

二、变量

1.变量的创建

2.变量的分类

3.算术操作符(运算符)

3.1. + 和 -

3.2. *

3.3. /

 3.4 %

 4.赋值运算符: =

 5.复合运算符

6.单目运算符 

7.强制类型转变 

总结


前言

本章学习的是数据类型的基础部分和变量的相关知识,非常简单。


一、数据类型介绍

数据类型分为两大类:1.内置类型   2.自定义类型

内置类型:  是编程语言中用于声明变量的基本数据类型种类,它在编程时可以直接使用,无需额外的定义或声明。它包括整型、浮点型、字符型、布尔类型

自定义类型: 它是为程序员提供的一种强大的数据建模工具,能以更抽象、更贴近实际问题的方式来组织和处理数据。它包括数组、结构体、枚举、联合体。

1.内置类型


1.1.整型

整型
短整型整型长整型更长整型
默认值shortintlonglong long
有符号(signed) short (int)(signed) int(signed) long (int)(signed) long long (int)
无符号unsigned short (int)unsigned intunsigned long (int)unsigned long long (int)

:括号内的可以省略 ,选择使用signed还是unsigned主要取决于具体应用场景的数据需求和取值范围。若数据需要负数,则应使用signed;反之则使用unsigned。对于int类型默认值是带正负号的。

更长整型是在C99中引进.

1.2.浮点型

浮点型
单精度双精度更大范围
floatdoublelong double

 注:更大范围是在C99中引进.

1.3.字符型

字符型
有符号无符号
字符型charsigned charunsigned char

: C语⾔规定 char 类型默认是否带有正负号,由当前系统决定。所以char可能是signed也可能是unsigned.

1.4.布尔类型

 布尔类型是在C99中被引进的.用来表示真与假.在之前是由整数0表示假,非0表示真。另外它需要头文件<stdbool.h>.

形式:  _Bool ,其取值是ture或者false.

_Bool flag = ture;

if(flag){
printf("flag is ture\n");
}

2.自定义类型 

自定义类型比较复杂,这里先跳过。


3.数据类型的长度

每种数据类型都有自己的长度,根据变量的长度,我们要灵活的运用数据类型。

char_Boolshortintlonglong longfloatdoublelong double
长度1字节1字节2字节4字节4字节8字节4字节8字节8字节

对于长度字节数相等的情况,C语言标准规定:

  • sizeof(long) > sizeof(int)
  • sizeof(long double) > sizeof(double) 

 注:1 Byte(字节) = 8 bit(比特位); 1个bit可以放入1个2进制的位.

4.sizeof操作符 

sizeof是一个操作符,也是一个关键字,用来计算类型的长度,单位是字节Byte

它有两种用法:

  • 1.sizeof (类型);
  • 2.sizeof (表达式); 
  •  :当表达式是单个变量时,可以忽略小括号。另外表达式不会参与运算,只根据表达式的类型给出大小。
int main() {
	int a = 5;
	int b = 2;
    int c = 0;
    printf("%zd\n", sizeof(int) );
    printf("%zd\n", sizeof a );
	printf("%zd\n", sizeof(a-b) );
    printf("%zd\n", sizeof(5-2) );
    printf("%zd\n", sizeof(c=a-b));
    printf("%d\n", c );
	return 0;
}

 在VS2022上的输出结果是:

sizeof 的计算结果是 size_t类型的,其占位符为%zd

  • 因为sizeof的返回值类型,是根据系统的不同而不同,如可能是unsigned int,unsigned long等,这不利于程序的可移植性,所以C语言创造了⼀个类型别名size_t ,用来统⼀表示sizeof的返回值类型。对应当前系统的 size_t 的返回值类型,可能是unsigned int或unsigned long long。

sizeof中表达式不参与计算

  • sizeof是一个静态操作符,它的结果在编译时就已经确定了。
  • sizeof的结果与表达式的运行值无关,编译器只需知道表达式的类型,因此不需要执行它。

5.signed和unsigned

它们是修饰整型和字符型

  • signed:表示一个类型带正负号。
  • unsigned:表示一个类型不带正负号,即只表示0和正整数。
  • unsigned的好处:同样长度的内存能够表示的最大整数值增大了一倍。即,若signed表示-10~10,用unsigned则可表示0~20。

二、变量

1.变量的创建

  • 变量创建的本质:在内存中申请一块空间。
  • 类型的用法:创建变量

 其中,经常变化的值称为变量,不变的值称为常量

语法形态:    数据类型   变量名;

:创建一个变量后要给一个初始值,这叫 初始化。

2.变量的分类

  • 全局变量:在大括号外部定义的变量,它可以在整个工程内使用。
  • 局部变量:在大括号内部定义的变量,它只能在自己的局部范围内使用。
#include <stdio.h>

int num = 10;    //全局变量

int main(){
   int num  = 1; //局部变量
   printf("%d\n",num);
   return 0;
}

当局部变量和全局变量同名时,局部变量优先。 

再了解一下变量在内存中存储位置

  • 在我们学习的C/C++语言中,有三个内存区域需要我们关注,即:栈区、静态区、堆区
  • 局部变量放在内存的栈区
  • 全局变量放在内存的静态区
  • 堆区是用来动态内存管理的

3.算术操作符(运算符)

操作符有:+ -* 、%   ,他们都是双目操作符,有两个操作数分别位于操作符的两端。

3.1. + 和 -

它们分别用来完成加法和减法

#include <stdio.h>
int main(){
    int a = 4;
    int b = 2;
    printf("%d\n",a+b);
    printf("%d\n",a-b);

    return 0;
}

3.2. *

它是用来完成乘法运算的

#include <stdio.h>
int main(){
    int a = 4;
    int b = 2;
    printf("%d",a*b);

    return 0;
}

3.3. /

它是用来处理除法运算的 ,它分为两类:整数除法浮点数除法

整数除法: 操作符两端的变量全部为整数

特点: 即使返回值的变量类型是浮点型,那返回值也只有整数部分,忽略小数部分。

#include <stdio.h>
int main() {
    float a = 5 / 2;
    int b = 5 / 2;
    printf("%f\n", a);   //输出:2.000000
    printf("%d\n", b);   //输出:2

    return 0;
}

 浮点数除法: 两个运算数至少有一个浮点数。

#include <stdio.h>
int main() {
    float a = 5 / 2;
    float b = 5.0 / 2;
    printf("%f\n", a);   //输出:2.000000
    printf("%f\n", b);   //输出:2.500000

    return 0;
}

 3.4 %

它是用来处理求模(余)运算,就是两个整数相除的余值。这个运算符只能用于整数

 

#include <stdio.h>
int main() {
    int a = 5 % 2;  
    printf("%d\n", a);   //输出:1

    return 0;
}

 4.赋值运算符: =

赋值: 在变量创建好后,即初始化后再给一个值。

#include <stdio.h>
int main() {
    int a = 0;  //初始化
    a = 6;      //赋值

    return 0;
}

 5.复合运算符

用来提供自增、自减等操作。

+=: 自增     -=: 自减     *=: 自乘     /=: 自除     %=: 自取余


    int a = 1;
    a = a + 1;  //等同于:   a += 1;
    a = a - 1;  //等同于:   a -= 1;
    a = a * 1;  //等同于:   a *= 1;
    a = a / 1;  //等同于:   a /= 1;
    a = a % 1;  //等同于:   a %= 1;

6.单目运算符 

它们有: ++   --   +   -     (其中+、-表示正负号)

对于++和--,它们分别表示自加1和自减1。又各分为前置型和后置型,它们的区别是先自+1(-1)后赋值,还是先赋值后自+1(-1)

  • 前置++和前置--
#include <stdio.h>
int main() {
    int a = 0;
    int b = 0;
    int c = ++a;
    int d = --b;
    printf("%d\n", a);   //输出:1
    printf("%d\n", b);   //输出:-1
    printf("%d\n", c);   //输出:1
    printf("%d\n", d);   //输出:-1
    return 0;
}

在 c  = ++a 中,先进行a的自加1,此时a内的值已是1,然后再将a的值赋给b。 同理,前置--也是如此。

  • 后置++和后置--
#include <stdio.h>
int main() {
    int a = 0;
    int b = 0;
    int c = a++;
    int d = b--;
    printf("%d\n", a);   //输出:1
    printf("%d\n", b);   //输出:-1
    printf("%d\n", c);   //输出:0
    printf("%d\n", d);   //输出:0
    return 0;
}

在c = a++ 中,先将a的值赋给c,接着再进行a的自加1,此时a内的值变为1。同理,后置--也是如此。

 +和-

  • 对于运算符+来说,它对于正负值没啥影响,写不写都行

如:   a = a  等价于  a = +a

  • 但运算符-不同,它会改变当前值的正负号。
#include <stdio.h>
int main() {
    int a = 3;
    int b = -a;
    int c = -b;
    printf("%d\n", b);   //输出:-3
    printf("%d\n", c);   //输出:3
    return 0;
}

7.强制类型转变 

在我们写代码时,有时会出现数据类型不同的警告,为了消除警告,我们可以使用强制类型转变

格式如下:  (类型)

#include <stdio.h>
int main() {
    float a = 5.23;
    int b = (int)a;
    int c = (int)5.23;
    printf("%d\n", b);   //输出:5
    printf("%d\n", c);   //输出:5
    return 0;
}

 这样5.23就变成整型,只保留整数部分。

但强制类型转变不是一个好方法,能不用就不用。


总结

以上就是数据类型和变量的基础知识了,看一看就记住啦。

标签:--,数据类型,unsigned,C语言,int,printf,类型,sizeof
From: https://blog.csdn.net/2302_80293320/article/details/139882768

相关文章

  • 产品经理技能揭秘:需求启发8大技术
    文章目录引言一、头脑风暴1.1基本规则1.2头脑风暴步骤1.3头脑风暴应用:6顶思考帽二、文档分析2.1好处2.2文档分析流程三、引导式研讨会3.1研讨会准备3.2研讨会组织指南3.2.1.控制交叉讨论与私人话题3.2.2.准时开始会议3.2.3.分配角色以促进会议流畅3.2.4.结......
  • 基于SpringBoot+Vue+uniapp的随心淘网管理系统(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于SpringBoot+Vue+uniapp的劳务外包管理系统(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 强化学习-表格型算法Q学习稳定倒立摆小车
    [[Q学习]]是表格型算法的一种,主要维护了一个Q-table,里面是状态-动作对的价值,分别由一个状态和一个动作来索引。这里以一个经典的道理摆小车问题来说明如何使用[[Q学习]]算法。这里会用到两个类,agent和brain。brain类中来维护[[强化学习的基本概念|强化学习]]算法的......
  • 2024暑假重庆训练记+总结
    Day-1明天就要去重庆了今天上午有一场模拟赛有点难(sohard)改题什么的留给重庆的我吧..今天自然要放松回家之后简简单单地吃了一碗面然后回家和同学们聊天晚上也是和另一个同学聊天但是她的手机坏了所以就不聊了额(挺不巧的)然后很早就睡觉了卷王\(lhy\)还在喝咖......
  • 大三求职:前端实习生
    0、个人简介目前华南理工大学广州学院计算机科学与技术本科大三在读,希望能在暑期找到一份前端的实习工作1、园子经历昵称: 养肥胖虎 园龄: 2年10个月 粉丝: 37  随笔-294  文章-2  评论-18  阅读- 90204截至2024/07/07博客大致分类如下Html飞机大战(21)......
  • 西瓜杯 WP
    RE一个西瓜切两半你一半我一半有点谜语,文本给的是输出和key#Visithttps://www.lddgo.net/string/pyc-compile-decompileformoreinformation#Version:Python3.6flag=''key='一个西瓜切两半你一半我一半'#output='乃乾觅甯剏乳厡侻丨厏扝乌博丿乜规甲剌乶厝侥丿......
  • 双亲委派机制和SPI的理解
    双亲委派机制和SPI的理解双亲委派机制基本原理双亲委派机制简单的来说是JVM类加载过程的一个非强约束模型。子类加载器加载对应的Class,不会直接加载,首先会交由其父类加载器加载,若父类加载器无法加载,则由自己加载。Java一共有三层类加载器,级别从上往下依次是:BootStrapClass......
  • Simple WPF: WPF 自定义按钮外形
    最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。WPF的按钮提供了Template模板,可以通过修改Template模板中的内容对按钮的样式进行自定义,完整代码Github自取。使用Style定义扁平化的按钮样式定义一个ButtonStyleDictonary.xaml资源字典文件,在ControlTemplate......
  • HDFS分布式集群搭建
    1、集群简介Hadoop集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起。另外,对于Hadoop的集群来讲,可以分为两大类角色:master和slave。(1)HDFS集群:负责海量数据的存储,集群中的角色主要有:NameNode(一个,master)、DataNode(若干,slave)和SecondaryName......