初始C语言3

news2024/12/23 9:09:01

目录

9. 操作符

9.1 算术操作符

9.2 移位操作符

9.3 位操作符

9.4 赋值操作符

9.5 单目操作符

9.6 关系操作符

9.7 逻辑操作符

9.8 条件操作符

9.9 逗号表达式

下标引用、函数调用和结构成员

10. 常见关键字

10.1 typedef

10.2 static

10.2.1 修饰局部变量

10.2.2 修饰全局变量

10.2.3 修饰函数

10.3 register-寄存器

11. #define 定义常量和宏

12. 指针

12.1 内存

12.2 指针变量的大小

13. 结构体


9. 操作符

C语言非常灵活:因为它提供了丰富的操作符。

9.1 算术操作符

+  -  *  /  %
//除和取模的区别
#include <stdio.h>
int main()
{
    int a = 7 / 2; 
    int c = 7 / 2.0; //除号的两边都是整数时,执行整数除法;若两边其中有一个浮点数,则执行浮点数的除法
    int b = 7 % 2; //取模操作符的两边只能是整数
    printf("%d\n",a); //3
    printf("%.1f\n",a); //2.5,%.1f:打印浮点型且小数点后保留一位
    printf("%d\n",b); //1
    return 0;
}

9.2 移位操作符

>>右移操作符   <<左移操作符
涉及二进制的运算,后面讲解

9.3 位操作符

&与   ^异或   |或
后面讲解    

9.4 赋值操作符

=  +=  -=  *=  /=  &=  ^=  |=  >>=  <<=
int main()
{
    int a = 0; //初始化
    a = 20; //赋值
    
    a = a + 3; //23
    //简化上面操作
    a += 3; //23
    
    return 0;
}

9.5 单目操作符

a + b  //+属于双目操作符,+两边分别有一个操作数
单目操作符:只有一个操作数
!           逻辑反操作
-            负值
+            正值
sizeof       操作数的类型长度(以字节为单位)
--           前置、后置--
++           前置、后置++
(类型)        强制类型转换
&            取地址,涉及指针后面讲解
*            间接访问操作符(解引用操作符),后面讲解
~            对一个数的二进制按位取反,涉及二进制后面讲解
//C语言中规定:0表示假,非0表示真
#include <stdio.h>
int main()
{
    int flag = 0;
    if (!flag)
    {
        printf("hehe\n"); //hehe
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int a = -10;
    int b = -a;
    printf("%d\n",b); //10
    return 0;
}
//sizeof是单目操作符,非函数
#include <stdio.h>
int main()
{
    int a = 10;
    printf("%d\n",sizeof(a)); //4字节
    printf("%d\n",sizeof(int)); //4字节
    printf("%d\n",sizeof a);  //4字节
    return 0;
}
//求数组的元素个数
#include <stdio.h>
int main()
{
    int arr[10] = {0};
    printf("%d\n",sizeof(arr)); //40字节,计算的是整个数组的大小,单位是字节
    printf("%d\n",sizeof(arr[0]));  //4字节
    printf("%d\n",sizeof(arr) / sizeof(arr[0])); //10,数组的元素个数
    return 0;
}
//后置++
#include <stdio.h>
int main()
{
    int a = 10;
    int b = a++; //后置++,先使用,后++。所以b=a;a=a+1
    printf("%d\n",a); //10
    printf("%d\n",b); //11
    return 0;
}
//前置++
#include <stdio.h>
int main()
{
    int a = 10;
    int b = ++a; //前置++,先++,后使用。所以a=a+1;b=a
    printf("%d\n",a); //11
    printf("%d\n",b); //11
    return 0;
}
//(类型)
#include <stdio.h>
int main()
{
    int a = (int)3.14; //3.14字面浮点数,编译器默认理解为double类型
    printf("%d\n",a); //3
    return 0;
}

9.6 关系操作符

>
>=
<
<=
!=       用于测试“不相等”
==       用于测试“相等”
#include <stdio.h>
int main()
{
    int a = 10;
    if (a = 3)  //将3赋值给a,则a=3,3为非零,为真则执行打印
    {
        printf("hehe\n"); //hehe
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int a = 10;  //初始化a=10
    if (a == 3)  //10不等于3为假,为假则不打印
    {
        printf("hehe\n"); //hehe
    }
    return 0;
}

9.7 逻辑操作符

&&  逻辑与,并且
||  逻辑或,或者
#include <stdio.h>
int main()
{
    int a = 10;
    int b = 20;
    if (a && b)  //a=10,非0为真;b=20,非0为真。两边均为真则执行打印
    {
        printf("hehe\n"); //hehe
    }
    return 0;
}
#include <stdio.h>
int main()
{
    int a = 10;
    int b = 0;
    if (a || b)  //a=10,非0为真;b=0为假。其中一边为真则执行打印
    {
        printf("hehe\n"); //hehe
    }
    return 0;
}

9.8 条件操作符

三目操作符:有3个操作数
exp1 ? exp2 : exp3
真      √       ×
假      ×       √
#include <stdio.h>
int main()
{
    int a = 10;
    int b = 20;
    int r = (a > b ? a : b);
    printf("%d\n",r); //20
    return 0;
}

9.9 逗号表达式

exp1, exp2, exp3, ···expN
逗号表达式:逗号隔开的一串表达式。
特点:从左向右依次计算,整个表达式的结果是最后一个表达式的结果。
#include <stdio.h>
int main()
{
    int a = 10;
    int b = 20;
    int c = 0;
    int d = (c=a-2 , a=b+c , c-3);
    //  c=10-2=8    a=20+8=28    8-3=5
    printf("%d\n",d); //5
}

下标引用、函数调用和结构成员

[]   ()   .   ->
//下标引用操作符
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9 };
    int n = 3;
    arr[n] = 20;  //[]是下标引用操作符,arr和3是[]的操作数
    return 0;
}
//函数调用操作符
int Add(int x,int y)
{
    return x+y;
}
int main()
{
    int sum = Add(2,3); //():函数调用操作符 Add,2,3都是()的操作数,且函数调用操作符不可省略
    return 0;
}

10. 常见关键字

//C语言本身内置的,关键字不是自己创建出来的,也不能自己创建
auto    //局部变量默认auto,通常省略,进入作用域创建,离开作用域销毁
break   //for,while,do while循环中使用,退出循环 
case    //switch与case搭配使用
char
short
int
long
float
double
const   //常属性,修饰变量
continue  //与循环一起使用  
default
do
else
enum    //枚举
struct   //结构体
union   //联合体或共用体
extern  //声明外部符号
for
goto  //实现跳转语句
if
register  //寄存器
return   //函数返回值
signed    //有符号的
unsigned   //无符号的
sizeof  //计算类型大小
static  //静态的,修饰函数和变量
switch  
typedef  //类型重命名
void   //无,用于函数的返回类型,函数的参数
volatile
while
int main()
{
    auto int a = 10;  //自动变量,通常省略,局部变量都是auto类型
    return 0;
}
//未全,暂时分类
for while do break continue
if switch case default goto
char short int long float double signed unsigned enum struct union void sizeof typedef
const
extern 
register static 
return
变量的命名:
1、有意义
int age;
int salary;

2、变量名必须是字母、数字、下划线组成,不能有特殊字符,同时不能以数字开头
int 2b; //error
int _2b; //ok

3、变量名不能是关键字

10.1 typedef

类型定义(类型重命名)

typedef unsigned int unit;
typedef struct Node
{
    int data;
    struct Node* next;
}Node;
int main()
{
    unsigned int num = 0;
    unit num = 1;
    
    struct Node n;
    Node n2;
    return 0;
}

10.2 static

static用来修饰变量和函数:
1、修饰局部变量---静态局部变量
2、修饰全局变量---静态全局变量
3、修饰函数---静态函数

10.2.1 修饰局部变量

#include <stdio.h>
void test()
{
    int a = 1;
    a++;
    printf("%d ",a);  //打印10个2,因为a是局部变量,进入作用域创建,离开作用域销毁
}
int main()
{
    int i = 0;
    while (i < 10)
    {
        test();
        i++;
    }
    return 0;
}
#include <stdio.h>
void test()  //void类型表示函数不需要返回(return)
{
    static int a = 1;
    a++;
    printf("%d ",a);  //2 3 4 5 6 7 8 9 10 11
}
int main()
{
    int i = 0;
    while (i < 10)
    {
        test();
        i++;
    }
    return 0;
}

static修饰局部变量时,局部变量出了作用域,不销毁。本质上static修饰局部变量时,改变了变量的存储位置。影响了变量的生命周期,生命周期变长,和程序的生命周期一样。

10.2.2 修饰全局变量

全局变量是具有外部链接属性的。

源文件通过编译+链接--->生成可执行程序

//add.c文件:
int g_val = 2022; //全局变量   

//test.c文件:
#include <stdio.h>
extern int g_val; //声明外部符号
int main()
{
    printf("%d\n",g_val); //2022
    return 0;
}
//add.c文件:
static int g_val = 2022; //静态变量   

//test.c文件:
#include <stdio.h>
extern int g_val; //声明外部符号
int main()
{
    printf("%d\n",g_val); //error
    return 0;
}

static修饰全局变量时,全局变量的外部链接属性变为了内部链接属性。

其它源文件(.c文件)就不能再使用到这个全局变量了。

我们在使用的时候,感觉作用域变小了。

10.2.3 修饰函数

函数是具有外部链接属性的。

//add.c文件:
int Add(int x,int y)
{
    return x + y;
}

//test.c文件:
#include <stdio.h>
extern int Add(int x,int y);
int main()
{
    int a = 10;
    int b = 20;
    int r = Add(a,b);
    printf("%d\n",r); //30
    return 0;
}

//add.c文件:
static int Add(int x,int y)
{
    return x + y;
}

//test.c文件:
#include <stdio.h>    
extern int Add(int x,int y);
int main()
{
    int a = 10;
    int b = 20;
    int r = Add(a,b);
    printf("%d\n",r); //warning
    return 0;
}

一个函数本来是具有外部链接属性的,但被static修饰时,外部链接属性就变为了内部链接属性。

其它源文件(.c文件)就不能使用了。

10.3 register-寄存器

电脑上的存储设备有哪些?

  • 寄存器(集成到CPU上)
  • 高速缓存(cache)
  • 内存
  • 硬盘

CPU---中央处理器

将数据从内存送到CPU进行处理,计算,由于技术发展,CPU处理速度加快,而内存跟不上,所以出现如图所示的金字塔。

int main()
{
    //寄存器变量
    register int num = 3; //建议将3存放在寄存器中,最终由编译器决定存放位置
    return 0;
}

11. #define 定义常量和宏

//#define 定义标识符常量

#define NUM 100
#include <stdio.h>
int main()
{
    printf("%d\n",NUM); //100
    int n = NUM;
    printf("%d\n",n); //100
    int arr[NUM] = { 0 }; //数组中有100个元素
    return 0;
}
//#define 定义宏,宏是有参数的
#define ADD(x,y) ((x)+(y)) //ADD:宏名;x和y是宏的参数,参数是无类型;后面括号内的是宏体
#include <stdio.h>
int Add(int x,int y)  //宏和函数相似,后续介绍
{
    return x+y;
}
int main()
{
    int a = 10;
    int b = 20;
    int c = ADD(a,b);
    printf("%d\n",c); //30,处理过程类似替换,int c = ((a)+(b))
    return 0;
}

.h:头文件(函数的声明、类型的声明、头文件的包含)
.c:源文件(函数实现)

浮点数的四舍五入,不能用你肉眼看到的数值来计算!因为浮点数在内存中有可能不能精确保存。如12.455,可能内存中存储的是12.454988888888828282···
数据存储中会详解。

12. 指针

12.1 内存

内存是电脑上特别重要的存储器,计算中的程序的运行都是在内存中进行的。

所以为了有效的使用内存,就把内存划分为一个个小的内存单元,每个内存单元的大小是1个字节

为了能够有效地访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址

综上所述:

内存会划分为一个个的内存单元(一个内存单元的大小:1Byte)。

每个内存单元都有一个编号(地址/指针)。

8进制:0-7
10进制:0-9
16进制:0-9,a, b, c, d, e, f
           10,11,12,13,14,15

内存中存储10:
0000 0000 0000 0000 0000 0000 0000 1010 //2进制
0    0    0    0    0     0    0    a
0x 00 00 00 0a  //16进制
#include <stdio.h>     
int main()
{
    int a = 10; //向内存申请4个字节(32bit),来存储10
    &a; //&:取地址操作符
    printf("%p\n",&a); //00000000005FFE9C,%p打印地址
    return 0;
}

调试可看监控窗口和内存窗口,后续出调试哇。也可自己上网查查资料。此处先不说。

#include <stdio.h> 
int main()
{
    int a = 10;
    int* p = &a; //p:指针变量
    //int说明p指向的对象a是int类型
    //*说明p是指针变量
    *p = 20; //*表示解引用操作符,*p就是p指向的对象。意思就是通过p中存放的地址,找到p所指向的对象a
    printf("%d\n",a); //20
    return 0;
}

内存单元

编号--->地址--->指针(地址也被称为指针)

存放指针(地址)的变量就是指针变量。

12.2 指针变量的大小

不管是什么类型的指针,都是在创建指针变量。

指针变量是用来存放地址的。

指针变量的大小取决于一个地址存放时需要多大空间。

  • 32位机器上的地址:32bit位---4Byte,所以指针变量的大小是4个字节(x86)
  • 64位机器上的地址:64bit位---8Byte,,所以指针变量的大小是8个字节(x64)

VS默认是x86平台,可调节嗷。

#include <stdio.h>
int main()
{
    printf("%zu\n",sizeof(char*)); //8字节
    printf("%zu\n",sizeof(short*)); //8字节
    printf("%zu\n",sizeof(int*)); //8字节
    printf("%zu\n",sizeof(float*)); //8字节
    printf("%zu\n",sizeof(double*)); //8字节
    return 0;
}

13. 结构体

描述人:名字+年龄+性别···

描述书:书名+作者+出版社···

人和书均为复杂对象,C语言就给了自定义类型的能力。自定义类型中有一种叫做:结构体。

结构体是把一些单一类型组合在一起的做法。

#include <stdio.h>
struct Stu  //类型
{
    //成员
    char name[20];
    int age;
    char sex[10];
    char tele[12];
};
int main()
{
    struct Stu s = {"zhangsan", 20, "nan", "15590001234"}; //创建struct Stu类型的对象s并进行初始化
    printf("%s %d %s %s\n",
           s.name, s.age, s.sex, s.tele); //zhangsan 20 nan 15590001234
    //结构体对象.成员名:访问结构体对象s里面的成员
    return 0;
}
#include <stdio.h>
struct Stu  //类型
{
    //成员
    char name[20];
    int age;
    char sex[10];
    char tele[12];
};
void print(struct Stu* ps)
{
    printf("%s %d %s %s\n",(*ps).name, (*ps).age, (*ps).sex, (*ps).tele); //zhangsan 20 nan 15590001234 
    //解引用指针,找到ps指针变量指向的结构体对象s。略显啰嗦
    printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->tele); //zhangsan 20 nan 15590001234
    //结构体指针变量->成员名
    
}
int main()
{
    struct Stu s = {"zhangsan", 20, "nan", "15590001234"}; //创建struct Stu类型的对象s并进行初始化
    print(&s); //将结构体对象s的地址(指针)传给print函数
    return 0;
}

 本周就暂且更新至此吧,期待下周再会。如有错误还请不吝赐教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2264156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Rust自学】4.5. 切片(Slice)

4.5.0. 写在正文之前 这是第四章的最后一篇文章了&#xff0c;在这里也顺便对这章做一个总结&#xff1a; 所有权、借用和切片的概念确保 Rust 程序在编译时的内存安全。 Rust语言让程序员能够以与其他系统编程语言相同的方式控制内存使用情况&#xff0c;但是当数据所有者超…

VPN技术-GRE隧道的配置

GRE隧道的配置 1&#xff0c; 在AR1上配置DHCP接口地址池&#xff0c;AR3上配置DHCP全局地址池 2&#xff0c; PC1获取的IP地址为10.10.10.253&#xff0c;PC2获取的IP地址为10.10.30.253 3&#xff0c;通过ip route-static将目的地址为10.10.30.253的流量引入到Tunnel #配…

碰撞检测算法之闵可夫斯基差集法(Minkowski Difference)

在游戏开发和机器人路径规划乃至于现在比较火的自动驾驶中&#xff0c;我们常常需要确定两个物体是否发生碰撞&#xff0c;有一种通过闵可夫斯基差集法求是否相交的算法&#xff0c;下面将介绍一下 闵可夫斯基差集法的优势 闵可夫斯基差集法优势&#xff1a; 可以处理复杂的…

Python OCR 文字识别

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

【系统】Windows11更新解决办法,一键暂停

最近的windows更新整的我是措不及防&#xff0c;干啥都要关注一下更新的问题&#xff0c;有的时候还关不掉&#xff0c;我的强迫症就来了&#xff0c;非得关了你不可&#xff01; 经过了九九八十一难的研究之后&#xff0c;终于找到了一个算是比较靠谱的暂停更新的方法&#x…

复合翼与倾转旋翼飞行器:设计与控制算法对比

一、引言 复合翼&#xff08;Compound Wing&#xff09;和倾转旋翼&#xff08;Tilt - Rotor&#xff09;飞行器在现代航空领域均占据独特地位&#xff0c;二者在设计和控制算法方面展现出显著差异。这些差异在飞行模式切换、推进系统设计、控制算法复杂度以及飞行器稳定性等多…

空闲中断配合DMA

1.传统串口接收数据&#xff1a;来一个字节接受一个。 2.一次中断将一包数据存到缓冲区 3.DMA原理

三格电子——新品IE103转ModbusTCP网关

型号&#xff1a;SG-TCP-IEC103 产品概述 IE103转ModbusTCP网关型号SG-TCP-IEC103&#xff0c;是三格电子推出的工业级网关&#xff08;以下简称网关&#xff09;&#xff0c;主要用于IEC103数据采集、DLT645-1997/2007数据采集&#xff0c;IEC103支持遥测和遥信&#xff0c;可…

HDLBits训练3

时间&#xff1a;2024.12.22 Hadd 代码 法一&#xff1a; module top_module( input a, b,output cout, sum );assign {cout,sum}ab; endmodule法二&#xff1a; 运行结果 Fadd 代码 法一&#xff1a; module top_module( input a, b, cin,output cout, sum );assign…

Qt之串口设计-线程实现(十二)

Qt开发 系列文章 - Serial-port&#xff08;十二&#xff09; 目录 前言 一、SerialPort 二、实现方式 1.创建类 2.相关功能函数 3.用户使用 4.效果演示 5.拓展应用-实时刷新 总结 前言 Qt作为一个跨平台的应用程序开发框架&#xff0c;在串口编程方面提供了方便易用…

STM32F407ZGT6-UCOSIII笔记12: 事件标志组

有时一个任务需要与多个事件同步&#xff0c;这就要用到事件标志组 本文学习与程序编写基于 正点原子的 STM32F1 UCOS开发手册 文章提供测试代码讲解、完整工程下载、测试效果图 目录 事件标志组&#xff1a; 定义与初始化事件标志组&#xff1a; #include "Public.h&quo…

聊一聊 C#前台线程 如何阻塞程序退出

一&#xff1a;背景 1. 讲故事 这篇文章起源于我的 C#内功修炼训练营里的一位朋友提的问题&#xff1a;后台线程的内部是如何运转的 ? &#xff0c;犹记得C# Via CLR这本书中 Jeffery 就聊到了他曾经给别人解决一个程序无法退出的bug&#xff0c;最后发现是有一个 Backgrond…

JVM性能优化一:初识内存泄露-内存溢出-垃圾回收

本文主要是让你充分的认识到什么叫做内存泄露&#xff0c;什么叫做内存溢出&#xff0c;别再傻傻分不清了&#xff0c;别再动不动的升级服务器的内存了。 文章目录 1.基本概念1.1.内存泄露1.2.内存溢出1.3.垃圾回收1.4.内存泄露-垃圾回收-内存溢出三者的关系关系 2.代码示例2.…

为什么使用环形队列

1.看以下两种情况。第一种不会出现问题&#xff0c;当主流程读取次数比较慢时&#xff0c;数据会被覆盖。 2.扩大空间。不可取。 3.什么是队列

【WRF教程第3.6期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解&#xff1a;以4.5版本为例 Geogrid/Metgrid 插值选项详解1. 插值方法的工作机制2. 插值方法的详细说明2.1 四点双线性插值&#xff08;four_pt&#xff09;2.2 十六点重叠抛物线插值&#xff08;sixteen_pt&#xff09;2.3 简单四点平均插值&#xff08;av…

批量提取zotero的论文构建知识库做问答的大模型(可选)——含转存PDF-分割统计PDF等

文章目录 提取zotero的PDF上传到AI平台保留文件名代码分成20个PDF视频讲解 提取zotero的PDF 右键查看目录 发现目录为 C:\Users\89735\Zotero\storage 写代码: 扫描路径‘C:\Users\89735\Zotero\storage’下面的所有PDF文件,全部复制一份汇总到"C:\Users\89735\Downl…

Java模拟Mqtt客户端连接Mqtt Broker

Java模拟Mqtt客户端基本流程 引入Paho MQTT客户端库 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.mqttv5.client</artifactId><version>1.2.5</version> </dependency>设置mqtt配置数据 …

boost asio 异步服务器

boost网络框架使用方法 boost绑定 首先介绍io_context&#xff0c;可以理解为这是操作系统和应用层数据交互的桥梁。有了它不必关注内核态的缓冲区&#xff0c;只需要关注自己定义在用户态的缓冲区&#xff0c;因为它会通过桥梁运输到用户态的缓冲区。 boost::asio::io_contex…

图解HTTP-HTTP协议

HTTP HTTP是一种不保存状态&#xff0c;即无状态的协议。HTTP协议自身不对请求和响应之间的通信进行保存。为了保存状态因此后面也有一些技术产生比如Cookies技术。 HTTP是通过URI定位网上的资源&#xff0c;理论上将URI可以访问互联网上的任意资源。 如果不是访问特定的资源…

【Go】-限流器的四种实现方法

目录 关于限流和限流器 固定窗口限流器 滑动窗口限流器 漏桶限流器 令牌桶限流器 总结 关于限流和限流器 限流&#xff08;Rate Limiting&#xff09;是一种控制资源使用率的机制&#xff0c;通常用于防止系统过载和滥用。 限流器&#xff08;Rate Limiter&#xff09;是…