C语言的数据类型的转换,运算符,控制流,以及数组的认识! 您所在的位置:网站首页 C语言整型数组循环退出条件 C语言的数据类型的转换,运算符,控制流,以及数组的认识!

C语言的数据类型的转换,运算符,控制流,以及数组的认识!

2023-07-11 13:13| 来源: 网络整理| 查看: 265

一.类型转换

概念:不一致但相互兼容的数据类型,在同一表达式中将会发生类型转换。

转换模式如下

隐式转换:系统按照隐式规则自动进行的转换

强制转换:用户显式自定义进行的转换

隐式规则:从小类型向大类型转换,目的是保证不丢失表达式中数据的精度

隐式转换代码:

char a = 'a';

int b = 12;

float c = 3.14;

float x = a + b - c; // 在该表达式中将发生隐式转换,所有操作数被提升为float

强制转换:用户强行将某类型的数据转换为另一种类型,此过程可能丢失精度

char a = 'a';

int b = 12;

float c = 3.14;

int d = (int)c;

float x = a + b - (int)c; // 在该表达式中a隐式自动转换为int,c被强制转为int

二,整型数据尺寸

概念:整型数据尺寸是指某种整型数据所占用内存空间的大小 C语言标准并未规定整型数据的具体大小,只规定了相互之间的 “ 相对大小 ” ,比如: short 不可比 int 长 long long 不可比 int 短 long 型数据长度等于系统字长(32位操作系统(2^32)long是占用4字节,64位操作系统(2^64)long 是占用 8字节)

系统字长:CPU 一次处理的数据长度,称为字长。比如32位系统、64位系统。

典型尺寸: char 占用1个字节 short 占用2个字节 int 在16位系统中占用2个字节,在32位和64位系统中一般都占用4个字节 long 的尺寸等于系统字长 long long 在32位系统中一般占用4个字节,在64位系统中一般占用8个字节

存在问题: 同样的代码,放在不同的系统中,可能会由于数据尺寸发生变化而无法正常运行。 因此,系统标准整型数据类型,是不可移植的,这个问题在底层代码中尤为突出。

三,可移植性整型 概念:不管放到什么系统,尺寸保持不变的整型数据,称为可移植性整型

关键:typedef

typedef int int32_t; // 将类型 int 取个别名,称为 int32_t

typedef long int64_t; // 将类型 long 取个别名,称为 int64_t

思路: 1. 为所有的系统提供一组固定的、能反应数据尺寸的、统一的可移植性整型名称

2. 在不同的系统中,为这些可移植性整型提供对应的 typedef 语句 系统预定义的可移植性整型:

int8_t   int16_t   int32_t   int64_t   uint8_t   uint16_t   uint32_t   uint64_t

四,运算符

1. 算术运算符

% 是算术运算符的重点,一般将某个数值控制在一定范围内,还有数据解析上

/与%在处理数据的时候可以进行提取低字节或者高字节数据比如0x123%10,或者0x123/10,应用场景比如温湿 度的截取 

2,单目运算符 目:目标操作数 ++ -- +(正号) -(负号) 前后缀运算:

(1). 前缀自加自减运算:先进行自加自减,再参与表达式运算(++a)

(2). 后缀自加自减运算:先参与表达式运算,在进行自加自减(a++)

3,双目运算符

+ - * / %

4,关系运算符

5,逻辑运算符

运算规则:

逻辑反:将逻辑真、假翻转,即真变假,假变真

逻辑与:将两个关系表达式串联起来,当且仅当左右两个表达式都为真时,结果为真。

逻辑或:将两个关系表达式并联起来,当且仅当左右两个表达式都为假时,结果为假。 

6. 位运算符(重点,对整个变量的某一位操作)

 7,条件运算符(三目运算符,重点) 唯一需要三个操作数的运算符

语法:表达式1?表达式2:表达式3

释义:当表达式1为真时,去表达式2,否则取表达式3

例如 int a = 200;

 int b = 100;

int m = (a>b) ? a : b; // 如果 a>b 为真,则 m 取 a 的值,否则取 b 的值

8.优先级与结合性

当表达式出现不同的运算符时,根据优先级来决定谁先执行,比如先乘除后加减 当表达式中出现多个相同优先级的运算符时,更具结合性决定谁先运行,比如从左到右

 五,控制流

二路分支

逻辑:程序中某段代码需要在满足某个条件时才能运行

形式:

if语句:表达一种 如果-则的条件执行关系

if-else语句:表达一种 如果-否则 的互斥分支关系

举例:

 

注意:

只要表达式的值为真(非0),则执行{}复合语句

if语句可以单独使用,else语句不可以,else语句必须根if语句配套使用

不管是if语句还是else语句,代码块都必须使用大括号{}括起来,否则只有首句有效

多路分支

辑:根据不同的条件执行不同的代码片段

语法:

switch(n)//条件 {     case 1:        printf("one\n");           break;     case 2:            printf("two\n");            break;        case 3:            printf("three\n");            break;        default:         printf("其他数字\n");  }

要点解析

switch(n)语句中的n必须是一个整型表达式,即switch判断的数据必须是整型或者字符

case语句只能带整型常量,包括普通整型或字符,不包括const型数据

break语句的作用是跳出整一个switch结构,没有break程序会略过case往下执行

default语句不是必须的,一般放在最后面(因此不需要break)

while与do...while循环

逻辑:使得程序中每一段代码可以重复循环的运行

形式:

while循环:先判断,再循环

while(表达式)// 表达式的值为真的时候进入循环体,为假退出 {     } while(1)// 死循环 等价于 while(1); {     } 如果循环体内只有一条语句,那么{}可以省略 while(1)    printf("11\n");

do-while循环:先循环,再判断

格式 do {     循环体; }while(表达式)

for循环

逻辑:与 while 循环类似,但更加紧凑,for 循环将控制循环的变量集中在一行

for(初始表达式1;判断表达式2;循环操作表达式3) {     循环体; } // 第一条表达式只执行一遍i = 0只执行一遍 // 然后执行表达式2,判断i 是否小于等于5,如果为真则执行{}里面的内容 // 最后执行表达式3,i++ // 然后一次循环完成再重新执行表达式2,判断i是否小于5,如果为真会执行 // {}里面的内容,最后执行表达式3,i++,依次类推,直到表达式2为假 // 则退出循环体 for(int i = 0; i      } 或者 for(;;); //多变量 for(int i = 0,j = 0; i < 5; i++,j++) {     printf("i:%d j:%d\n",i,j); }

for嵌套

int main(int argc, char const *argv[]) {     for(int i = 0; i < 5; i++)// 外循环     {         for(int j = 0; j < 4; j++)// 内循环         {             printf("i:%d j:%d\n",i,j);         }     }     return 0; }

break(退出)与continue(继续)

运用场景与特点

break关键字只能用于循环(while for do...while)和switch语句中,表示结束循环或者跳出switch语句

break关键字只能跳出最近一层的循环,也就是说,如果有多重循环,只能跳出最靠近break语句那层循环

break关键字 不能 单独用于 if语句中,除非if语句外面包含了循环

逻辑:

continue关键字只能用于循环体中(while do...while for),用于提前结束当前循环体后,又从最近一层循环体开始执行

continue关键字不能 单独用于 if语句或者switch 语句中,除非外面包含了循环

break:① 跳出 switch 语句; ② 跳出当层循环体

continue:结束当次循环,进入下次循环

 六,数组初阶

基本概念

数组的概念

由相同类型的多个元素所组成的一种复合数据类型

在工程中同时定义多个相同类型的变量时,重复定义,可以使用数组

逻辑:一次性定义多个相同的变量,并存储到一片连续的内存中

格式

类型说明符 数组名[整型常量表达式];

类型说明符:指定数组元素的数据类型,任意c语言合法类型都可以

数组名 : c语言标识符,其值为该数组的首地址(常量)

int a[5];//定义一个数组a,该数组一个由五个元素,每个元素都是int类型

int size = 4; int array[size];//变长数组,如果式局部变量则正确,全局变量编译出错

语法释义:

a是数组名,即这片连续内存的名称

[5]代表这片连续内存总共分成5个相等的格子,每个格子称为数组的元素

int代表每个元素的类型,可以是任意基本类型,也可以是组合类型,甚至可以是数组

数组中所有元素的类型都是一致

数组申请的空间是连续的,从低地址到高地址依次连续存放数组中的每个元素

数组定义

#include

int main(int argc, char const *argv[]) {     // 申请5块连续的空间,将a称为数组     int a[5];     // 将这5块空间逐一赋值,注意,数组下标从0开始     a[0] = 1;     a[1] = 20;     a[2] = 30;     a[3] = 40;     a[4] = 50;     //a[5] = 60; // 越界,无法使用     printf("%d\n",a[4]);

    // 循环给数组a赋值     for(int data = 10,i = 0; i < 5; i++,data+=10)     {         a[i] = data;     }

    // 遍历输出     for(int i = 0; i < 5; i++)     {         printf("%d\n",a[i]);     }     return 0; }

初始化:在定义的时候赋值,称为初始化

// 正常初始化 int a[5] = {100,200,300,400,500};

int a[5] = {100,200,300,400,500,600}; // 错误,越界了 int a[ ] = {100,200,300}; // OK,自动根据初始化列表分配数组元素个数 int a[5] = {100,200,300}; // OK,只初始化数组元素的一部分 // 不能在使用变长数组的情况下初始化数组 int a[size] = {1,2,3};//编译出错 // 变长数组只能先定义再使用 int a[size]; // 正确的 a[0] = 10;

测量数组的总大小:sizeof(array) 测量数组元素个数:sizeof(array)/sizeof(array[0])

数组名[下标] "下标":C语言的下标是从0开始,下标必须是>=0的整数 a[0]、a[1]、a[n]

引用数组元素a[i]和普通变量一样,既可以作为左值,也可以作为右值 下标最小值为0,最大值为 元素个数 -1

int a[5]; // 有效的下标范围是 0 ~ 4 a[0] = 1; a[1] = 66; a[2] = 21; a[3] = 4; a[4] = 934;

a[5] = 62; // 错误,越界了 a    = 10; // 错误,不可对数组名赋值 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有