• 【猫meme】轻松C语言-2.C语⾔数据类型和变量


     1.数据类型

    c语言中存在多种数据类型,可以用来记录生活中的各种数据。

    接下来我们来介绍下各个类型

    1.1整型

    整型也分为多个整型,看下图:

    1.2浮点型

    可以用来记录小数:

    1.3字符型

    字符型只占两个字节

    1.4布尔类型

    该类型是在C99标准中引入的新类型,是专门用来表示真假的.

    它的值有:0(表示假或条件不成立)非0(表示真或条件成立).

    2.sizeof操作符和signed-unsigned

    2.1sizeof操作符

    sizeof既是关键字,也是操作符.

    sizeof用于计算各种类型的长度,单位是字节.

    sizeof的返回类型size_t

    注意:

    size_t是C语言为了提高程序的可移植性而创造的

    对于sizeof的返回值size_t的类型,C语⾔只规定是⽆符号整数并没有规定具体的类型,⽽是系统⾃⼰去决定的.

    在不同的系统中size_t的返回类型不一定相同,

    返回值的类型有可能是unsigned int,或者unsigned long,亦或是unsigned long long.

    如图:

    2.1.1sizeof中表达式不计算

    sizeof括号中的表达式并不会进行真实的运算赋值,只用于计算最终类型的大小

    如图:

    因为表达式要在程序运⾏期间才能执⾏,而代码在编译时就已经将表达式的最终类型确定了,也就是说在编译时sizeof已经处理了,所以在运⾏期间就不会执⾏表达式了。

    2.2signed和unsigned


    C语⾔使⽤ signed 和 unsigned 关键字修饰字符型和整型类型。
    1.signed 关键字,表⽰⼀个类型带有正负号,包含负值
    2.unsigned 关键字,表⽰该类型不带有正负号,只能表⽰零和正整数

    即:signed int a;可以表达负数,而unsigned int a;则不行.并且一般signed会隐藏(无需特别编写).
     在使用unsigned时则需要自己编写

    unsigned 既然没了负数,那么正数部分范围则变大了.⽐如,16位的 signed short int 的取值范围是:-32768~32767;⽽unsigned short int 的取值范围是:0~65535

    更多的取值范围可以参看 limits.h 中给出的定义

    注意:

    C语⾔规定 char 类型默认是否带有正负号,由当前系统决定
    这就是说,
    char 不等于 signed char ,它有可能是 signed char ,也有可能是
    unsigned char 。
    这⼀点与 int 不同, int 就是等同于 signed int.

    3.变量
     

    3.1变量的创建
     

    C语⾔中把经常变化的值称为变量,不变的值称为常量

    常量不可改变的状态,只能读取调用(只读)

    在变量创建时给变量赋值就叫初始化.

     3.2变量的分类

    若是局部变量与全局变量重名怎么办? 

     我们可以看到,在程序中是局部变量优先

     3.3全局变量和局部变量在内存中的存储位置

     在学习C语言的时候,我们通常会关注内存中的三个区域:

    栈区、堆区、静态区
    在系统中,内存的分区其实更加精细复杂.后面会介绍到.

     4.算术操作符:+、-、*、/、%

    C语言为了计算的方便,提供了一系列的操作符(也可以叫运算符)

    其中有一组被称为算术操作符(也称双目操作符)

    4.1+和-

     +、-就用于加减法运算。

    因为+和-都有两个操作数(位于操作符两端),所以叫双目操作符

     4.2*和/

    注意:如果要C语言进行浮点数运算,算式中必须存在至少一个浮点数 

    拓展小芝士(知识) :若想要控制浮点数输出的小数位,只要在%f的中间加上  ."数字",如%.2f就是输出到小数点后两位

    4.3'%'

    运算符 % 表⽰求模运算,即返回两个整数相除的余值。这个运算符只能⽤于整数不能⽤于浮点数(就是取两数相除的余数)

    正负号是由第⼀个运算数的正负号决定

    5.赋值操作符:'='和复合赋值

     变量创建的时候给⼀个初始值叫初始化,在变量创建再给⼀个,这叫赋值

     5.1连续赋值

     如图所示,其中c=b=a+3就是连续赋值,从右到左进行赋值运算(a=3,b=6,c=6)。

    这样的代码,一般不易理解,建议拆开进行赋值,较易理解 。

    5.2复合赋值 

     在c语言中,我们可以对一个变量进行"自加""自减",例如:

    ,及其简化版:这就是复合操作符.这样有利于我们简化操作。

    还有一下复合操作符:

    6.单目操作符 :++、--、+、-

     既然C语言中有双目操作符,那肯定少不了单目操作符。

    C语言中把只有一个操作数的操作符叫做单目操作符.

    ++、--、+(正)、-(负) 就是单⽬操作符的。
     

     6.1++和--

    ++是⼀种⾃增的操作符,⼜分为前置++和后置++,同理,--是⼀种⾃减的操作符,也分为前置--和后置--.

    6.1.1前置和后置++ 

     

    后置++,就类似于我们平时买东西的“先用后付

    前置++,就有点像,我们卖游戏账号,必须走平台,先交钱,后收货 (不然就挨骗)

    6.1.2 前置和后置--

    --也是同理

    不可靠消息:前置++,和后置--的运行效率略高于后置++和前置--

    6.2+和-

    这里讲的 +和-就是单目操作符

    运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错.

    这里的-号和数学中的一样,负数前加-号就得到正号。

    7.强制类型转化 

     操作符中有⼀种特殊的操作符是强制类型转换,语法形式很简单

    具体看代码:

    float转成int时,数值也会变为整型

    一般我们不使用强制类型转化,除非万不得已。

    8.scanf和printf函数
     

     8.1 printf

    8.1.1 基本⽤法

    printf 函数是在库函数stdio.h中定义的,

     printf() 的作⽤是将参数⽂本输出到屏幕。printf ⾥的 f 代表 format (格式化),表⽰可以
    定制输出⽂本的格式。

    就会打印出Hello World

    printf不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅不会⾃动换

    如果想让光标移动到下一行(换行),可以在printf中“ ”的语句末尾加上\n.


     8.1.2 占位符

    printf() 可以在输出⽂本中指定占位符(这个位置可以⽤其他值代⼊)

    输出⽂本⾥也可以使⽤多个占位符

    printf() 参数占位符⼀⼀对应关系,如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值(乱码).
    ↓更多占位符↓ 

    %a :⼗六进制浮点数,字⺟输出为⼩写。
    %A :⼗六进制浮点数,字⺟输出为⼤写。
    %c :字符。
    %d :⼗进制整数。
    %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
    %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
    %i :整数,基本等同于 %d 。
    %f :⼩数(包含 float 类型和 double 类型)。
    %g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e
    为⼩写。
    %G :等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
    %hd :⼗进制 short int 类型。
    %ho :⼋进制 short int 类型。
    %hx :⼗六进制 short int 类型。
    %hu :unsigned short int 类型。
    %ld :⼗进制 long int 类型。
    %lo :⼋进制 long int 类型。
    %lx :⼗六进制 long int 类型。
    %lu :unsigned long int 类型。
    %lld :⼗进制 long long int 类型。
    %llo :⼋进制 long long int 类型。
    %llx :⼗六进制 long long int 类型。
    %llu :unsigned long long int 类型。
    %Le :科学计数法表⽰的 long double 类型浮点数。
    %Lf :long double 类型浮点数。
    %n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
    %o :⼋进制整数。
    %p :指针。
    %s :字符串。
    %u :⽆符号整数(unsigned int)。
    %x :⼗六进制整数。
    %zd : size_t 类型。
    %% :输出⼀个百分号。

    8.1.3限定宽度

    printf() 函数是允许限定占位符的最⼩宽度
    如下图中%5d 表⽰这个占位符的宽度⾄少为5位,如果不满5位,会在对应的值的前⾯会添加空格
    C语言中,输出的值默认右对⻬

    如果想改成左对⻬,可以在占位符的 % 的后⾯插⼊⼀个 - 号,在输出内容后⾯添加空格

     

    对于⼩数,这个限定符会限制所有数字最⼩显⽰宽度

    8.1.4 总是显⽰正负号

    一般情况下,printf() 不对正数显⽰ + 号,只对负数显⽰ - 号。

    如果想让正数也输出 + 号,可以在占位符的 % 后⾯加⼀个 + 。

    8.1.5限定⼩数位数
     

    这个前面有简单提到,就是在%后面加 .'数字'

    除此之外,还有一种写法 就是:“数字” . “数字”

    这里又分为两种写法

    8.1.5.1输出部分字符串

    字符串的打印是使用%s,默认情况下,是全部输出。可以通过%.“数字”s 指定输出的⻓度

    如↑图 

    8.2 scanf

     我们定义变量之后,就可以通过 scanf函数来用键盘对变量进行赋值

    注意:标准输⼊⼀般指的就是键盘,标准输出⼀般指的就是屏幕

    8.2.1基本用法

    scanf函数属于头文件 stdio.h,与printf 比较类似

    不同的是 scanf("占位符",变量的地址(首地址)),c语言需要通过占位符判断输入类型通过地址来修改变量的内容

    scanf() 函数⽤于读取⽤⼾的键盘输⼊,当程序运行到scanf时就会停下来,等待用户输入.


    scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等
    ↓例如:↓

    这是输入字符串的情况

     

    注意:

    scanf() 处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始直到读完缓存遇到第⼀个不符合条件的字符为⽌。
     

    8.2.2 scanf的返回值

    scanf() 的返回值是⼀个整数,表⽰成功读取变量个数
     如果没有读取任何项,或者匹配失败,则返回 0

    如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量EOF(-1)
    👇  来看例子:👇

    1.正常读取

    2. 用CTRL+ZEOF不符值)中断输入

     可以看到 r 的值为1,表示scanf 只读取了一个数

    3. 全用CTRL+ZEOF不符值

     可以看到 r 的值为-1,说明scanf 并未成功读取任何值,返回值为EOF

    8.2.3 占位符
     

     scanf() 与 printf() 的占位符基本⼀致,常⽤的占位符如下:

     %c :字符
     %d :整数
     %f : float 类型浮点数
     %lf : double 类型浮点数
     %Lf : long double 类型浮点数
     %s :字符串
     %[ ] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配会停⽌

    除了 %c 以外,都会⾃动忽略起⾸空⽩字符%c 不忽略空⽩字符总是返回当前第⼀个字符,⽆论该字符是否为空格
     如果%c需要跳过空⽩字符,我们可以通过scanf(" %c")的%c前面输入一个空格,表示跳过0个或多个空白字符

    %s在这里比较特殊 ,它其实不能简单地等同于字符串。它的规则是从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌

    %s 不会包含空⽩字符,所以⽆法⽤来读取多个单词
     scanf() 遇到 %s 占位符,会在输入的字符串变量末尾存储⼀个空字符 \0

    输入n个字符,就会得到(n+1)大小的字符串,多出来的一个就\0

    scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度
     

     我们可以通过scanf("%'数字's");来限定输入字符的个数,以此防止数组越界.

    8.2.4 赋值忽略符

    不可避免的,⽤⼾的输⼊有时可能不符合预定的格式

    c语言为此提供了一种解决方法

    赋值忽略符 *,只要在占位符中间加入*就可以忽略相对应类型的值或符号

    如%*d,%*c等等

  • 相关阅读:
    【数据结构与算法】之深入解析“两个盒子中球的颜色数相同的概率”的求解思路与算法示例
    【 Git 】 Merge or Rebase
    UVA 10050【埃筛】【set】
    Mobile App自动化测试技术及实现
    【JavaWeb】JSP(172-190)
    并发——中断机制
    【使用 Python 实现算法】01 语言特性
    css设置输入框边框无效或者不展示边框
    Docker Compose
    总结10.11-11.6号
  • 原文地址:https://blog.csdn.net/qq_42882091/article/details/136762247