(学习记录)C 0003——简单的了解C语言

2024-04-13 10:08

本文主要是介绍(学习记录)C 0003——简单的了解C语言,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从0开始的C语言

  • 0 简单的了解操作符
    • 0.1 位操作符
      • 0.1.0 位操作符 “ & ”
      • 0.1.1 位操作符 “ ^ ”
      • 0.1.2 位操作符 “ | ”
    • 0.2 赋值操作符
      • 0.2.0 “ = ”
      • 0.2.1 “ += 、-= 、*= 、/= ”
      • 0.2.2 “ &= 、^= 、|= ”
      • 0.2.3 “ <<= 、>>= ”
    • 0.3 单目操作符
      • 0.3.0 “ ! ”
      • 0.3.1 “ + 、- ”
      • 0.3.2 “ & ”
      • 0.3.3 “ sizeof ”
      • 0.3.4 “ ~ ”
      • 0.3.5 “ ++ ”
      • 0.3.6 “- -”
        • 0.3.6.0 注意不可取的++ --问题
      • 0.3.7 “ * ”
      • 0.3.8 “(类型)”
    • 0.4 关系操作符
    • 0.5 逻辑操作符
    • 0.6 条件操作符
    • 0.7 逗号表达式
    • 0.8 下标引用、函数调用和结构成员
  • 1. 常见的关键字
    • 1.0类型关键字:
    • 1.1 循环语句关键字
    • 1.2 选择语句关键字
    • 1.3 数据类型关键字
    • 1.4 其他常见的关键字
  • 2.简单了解4个关键字
    • 2.0 auto
    • 2.1 typedef
    • 2.2 register
    • 2.3 static
  • 3. define 定义的常量和宏
  • 总结


0 简单的了解操作符

算数操作符:+ - * / %
移位操作符:>> <<
位操作符有:& ^ |
赋值操作符:= += -= *= /= &= ^= |= >>= <<=
单目操作符:!- + & sizeof ~ -- ++ * (类型)
关系操作符:> >= < <= != ==
逻辑操作符:&& ||
条件操作符:exp1?exp2:exp3
逗号表达式:exp1,exp2,exp3,…expN
下标引用、函数调用和结构成员:[] () . ->

算数操作符和移位操作符 详见0002


0.1 位操作符

位操作符有:& ^ |


0.1.0 位操作符 “ & ”

位操作符 & 的意思是 (按2进制位)

的计算方式是:两个数所对应的二进制位,只要存在一个零,与的结果就为零。

  • 例一
int main()
{int a = 3;int b = 5;int c = a & b;//按位与 —— 只要有 0 结果就为 0//a == 0000 0000 0000 0000 0000 0000 0000 0011 == 3//b == 0000 0000 0000 0000 0000 0000 0000 0101 == 5//c == 0000 0000 0000 0000 0000 0000 0000 0001 == 1printf("%d\n", c);//结果为1return 0;
}

0.1.1 位操作符 “ ^ ”

位操作符 ^ 的意思是 (按2进制位)异或

异或的计算方式是:两个数所对应的二进制位,相同为0,相异为1。

int main()
{int a = 3;int b = 5;int c = a ^ b;//按位异或 —— 相同为0,相异为1//a == 00000000000000000000000000000011 == 3//b == 00000000000000000000000000000101 == 5//c == 00000000000000000000000000000110 == 6printf("%d\n", c);return 0;
}

0.1.2 位操作符 “ | ”

位操作符 | 的意思是 (按2进制位)

的计算方式是:两个数所对应的二进制位,存在一个1,或的结果为1

int main()
{int a = 3;int b = 5;int c = a | b;//按位或 —— 只要有1就为100000000000000000000000000000011 == 300000000000000000000000000000101 == 500000000000000000000000000000111 == 7printf("%d\n", c);return 0;
}

0.2 赋值操作符

赋值操作符:= += -= *= /= &= ^= |= >>= <<=


0.2.0 “ = ”

" = "的意思是赋值1
它和等于的意思不同。

例:

int main()
{int a = 10;//创建变量a,并且初始化为10.a = 20;//20赋值给areturn 0;
}

0.2.1 “ += 、-= 、*= 、/= ”

int main()
{//加等 +=int a = 10;//创建一个变量a,并切初始化为10.a += 10;//a加等10 //等价于a = a + 10;//减等 -= a -= 10;//a减等10//等价于a = a - 10;//乘等 *=a *= 10;//a乘等10//等价于a = a * 10;//除等 /=a /= 10;//a除等10//等价于a = a / 10;return 0;
}

0.2.2 “ &= 、^= 、|= ”

int main()
{//与等 &=int a = 10;//创建一个变量a,并切初始化为10.a &= 3;//a 与等 3//等价于a = a & 3; //异或等 ^=a ^= 3;//a 异或等 3//等价于a = a ^ 3;//或等 |=a |= 3;//a 或等 3//等价于return 0;
}

0.2.3 “ <<= 、>>= ”

int main()
{//左移等 <<=int a = 10;a <<= 1;//等价于a = a << 1;//a == 00000000000000000000000000000010//二进制位向左移动一位//a == 00000000000000000000000000000100//右移等 >>=a >>= 1;//等价于a = a >> 1;return 0;
}

0.3 单目操作符

单目操作符:!- + & sizeof ~ -- ++ * (类型)


0.3.0 “ ! ”

! 的意思是逻辑反操作

C语言的判断真假:非 0 就是真,0就是假。
例如5是真,0是假。

int main()
{int a = 10;if(a)//a为真,进入if语句{}if(!a)//a为假,进入if语句{}return 0;
}

0.3.1 “ + 、- ”

正号 +
负号 -

int main()
{int a = 10;int b = -a;//负值int c = a;//正号(+)一般省略return 0;
}

0.3.2 “ & ”

& - 取地址操作符,学指针时学习。


0.3.3 “ sizeof ”

sizeof - 操作数的类型长度(以字节为单位)

int main()
{int a = 10;printf("%d\n",sizeof(a));//结果为4字节printf("%d\n",sizeof(int));//结果为4字节return 0;
}

0.3.4 “ ~ ”

~ 是对一个数的二进制位按位去反。
例一:为什么打印结果是-1呢?

int main()
{int a = 0;printf("%d\n",~a);//结果打印为-1//00000000000000000000000000000000 == a//~ 按位取反//11111111111111111111111111111111 == 4294967295return 0;
}

补充:整数在内存中储存的时候,存储的是二进制。

一个整数的二进制表示有3种形式:原码、反码和补码。

正的整数:原码、反码、补码都相同。
负的整数:原码。反码。补码需要计算。

例:

int main()
{//有符号的整数,最高位是0,表示正数.int a = 1;//int a 是4个字节,也就是32个比特位//原码 = 00000000000000000000000000000001//反码 = 00000000000000000000000000000001//补码 = 00000000000000000000000000000001//有符号的整数,最高位是1,表示负数.a = -1;//原码是:根据这个数的真实值,结合符号位,得出的//原码 = 10000000000000000000000000000001//反码是:符号位不变其他位按位取反,得出的//反码 = 11111111111111111111111111111110//补码是:反码的二进制序列加一,得出的//补码 = 11111111111111111111111111111111return 0;
}

内存中存储整数的时候,存储的是补码,计算的时候采用的也是补码。

例一中按位取反后,得到的是a的补码,所以要补码转换为原码,再打印出来。

int main()
{int a = 0;printf("%d\n",~a);//结果打印为-1//00000000000000000000000000000000 == a//~ 按位取反//11111111111111111111111111111111  ——补码//补码减一,得到反码//11111111111111111111111111111110  ——反码//反码符号位不变,按位取反,得到原码//10000000000000000000000000000001  ——原码return 0;
}

所以结果为-1;


0.3.5 “ ++ ”

++分为
前置++ 和 后置++

int main()
{int a = 2;//前置++ ,先++,后使用int c = ++a;printf("c = %d\n", c);//3printf("a = %d\n", a);//3//后置++ ,先使用,后++int c = a++;printf("c = %d\n", c);//2printf("a = %d\n", a);//3return 0;
}

0.3.6 “- -”

–分为
前置–和后置–

int main()
{int a = 2;//前置-- ,先--,后使用int c = --a;printf("c = %d\n", c);//1printf("a = %d\n", a);//1//后置-- ,先使用,后-- int c = a--;printf("c = %d\n", c);//2printf("a = %d\n", a);//1return 0;
}

0.3.6.0 注意不可取的++ --问题

有一些代码,虽然编译器可以编译过去,但是每个编译器的计算结果不同,所以这些代码是不可取的、是错误的代码

如:

//不可取的代码
//每个编译器结果不同 gcc 的结果是 10;
int main()
{int a = 1;int b = (++a) + (++a) + (++a);printf("b = %d\n", b);//vs的结果是12return 0;
}
//错误的代码
int main()
{int a = 10;printf("%d %d\n", --a, --a);//8 8return 0;
}

0.3.7 “ * ”

间接访问操作符(解引用操作符),在指针部分学习。


0.3.8 “(类型)”

强制类型转换-尽量避免,能不使用就不要使用。

int main()
{int a = (int)3.14;printf("%d\n", a);//3return 0;
}

0.4 关系操作符

关系操作符有:
大于 >
等于 ==
小于 <
不等于 !=
大于等于 >=
小于等于 <=


0.5 逻辑操作符

逻辑操作符有:
逻辑与 && 相当于并且的意思
逻辑或 || 相当于或者的意思

用法:

int main()
{int a = 3;int b = 4;if ((a == 3) && (b == 4)){printf("哈哈\n");}//当a等于3并且b等于4时,打印哈哈if ((a == 3) || (b == 4)){printf("呵呵\n");}//当a等于3或者b等于4时,打印呵呵return 0;
}

0.6 条件操作符

条件操作符 也叫 三目操作符
用法:

int main()
{int a = 10;int b = 0;if (a == 5){b = -6;}else{b = 6;}//相当于b = ((a == 5) ? (-6) : (6));// 如果a ==5 ,b ==-6 否则 b==6。return 0;
}

0.7 逗号表达式

逗号表达式从左向右依次计算,整个逗号表达式的结果是最后一个表达式的结果
例题:

int  main()
{int a = 0;int b = 3;int c = -1;int d = (a = b - 5, b = a + c, c = a + b, c -= 5);//a = 3-5 = -2   //b =(-2)+(-1)= -3   //c = (-2) + (-3) = -5      //c = c - 5 = -5 - 5 = -10printf("%d\n", d);// 打印的结果为-10return 0;
}

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

下标引用、函数调用和结构成员:[] () . ->
结构成员. ->,这两个操作符,在学习结构体时学习。
用法:

int Add(int x, int y)
{return x + y;
}
void test()
{}
int main()
{//[]下标引用int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//数组的下标从0开始数,arr[0]代表的是1,arr[6]代表的是7printf("%d\n", arr[9]);//10//arr和9是[]的操作数//()函数调用操作符printf("hehe\n");int ret = Add(3, 5);test();return 0;
}

1. 常见的关键字

1.0类型关键字:

  1. char 字符
  2. short 短整型
  3. int 整型
  4. long 长整型
  5. folat 单精度浮点型
  6. double 双精度浮点型
  7. void 空类型也是无的意思

1.1 循环语句关键字

  1. break 意思是跳出、停止、中断。用于循环语句和switch语句
  2. continue 的意思是继续 只能用于循环语句
  3. do 用于 do while 循环
  4. for 用于for循环语句
  5. while用while循环语句

1.2 选择语句关键字

  1. case 用于 switch case 语句,同switch一起使用
  2. default 用于switch语句的默认选项。
  3. else 用于if else语句
  4. goto是跳转的意思,可以实现分割的效果,也可以实现循环
  5. if 用于if else语句
  6. switch 用于switch语句

1.3 数据类型关键字

  1. enum 枚举关键字
  2. struct 结构体关键字
  3. union 联合体也叫共用体

1.4 其他常见的关键字

  1. auto(自动)自动变量
  2. const 常属性
  3. extern 声明外部符号的
  4. register 寄存器
  5. return 返回 应用到函数
  6. signed 有符号数
  7. unsigned 无符号的
  8. sizeof 计算所占内存空间大小的
  9. static 静态的,用来修饰变量,函数等
  10. typedef 类型重定义
  11. volatile 易变得。在学习linux时学习

2.简单了解4个关键字

2.0 auto

auto是自动的意思,在C语言中的意思为自动变量

一个局部变量变量进入局部作用域时创建,出局部作用域时销毁,所以局部变量也称为自动变量,也就是说所有的局部变量都是自动变量,所以一般省略auto。

int main()
{auto int a = 10;return 0;
}

2.1 typedef

typedef顾名思义是类型定义,也可以理解为类型重命名。

比如,某个工程中用到很多个无符号数,但是unsigned int 每次写很麻烦,所以可以用typedef简化它,如简化为unit

typedef unsigned int unit;
int main()
{unsigned int num = 100;unit num2 = 200;return 0;
}

2.2 register

register(寄存器)是存储空间 ,一般集成在CPU中,不同于内存,是独立的存储空间。

用法:

int main()
{register int num = 100;//建议把100存放在寄存器中,由编译器最终决定,是否存入寄存器&num;//错误,取地址的取是取内存的地址return 0;
}

2.3 static

static 在C语言中的用法:
1.修饰局部变量
2.修饰全局变量
3.修饰函数

  • 修饰局部变量用例:
    在没有用static修饰时,代码运行结果是这样的:
void test()
{int a = 1;a++;printf("%d", a);
}
int main()
{int i = 0;while (i < 10){test();i++;}return 0;
}//运行结果为 2222222222

用static修饰后:


void test()
{//static修饰局部变量static int a = 1;a++;printf("%d ", a);
}
int main()
{int i = 0;while (i < 10){test();i++;}return 0;
} //运行结果为 2 到 11

结论:static修饰局部变量时,改变了变量的生命周期,但不影响作用域。

  • 修饰全局变量用例
    创建两个源文件,test1.c和 test2.c
    在test1 定义一个全局变量int g_val = 2021;
    在test2 中可以正常打印
//声明外部符号 extern
extern int g_val;
int main()
{printf("%d\n", g_val);return 0;
}

当static修饰全局变量时static int g_val = 2021;
test2不能正常打印
运行结果
结论:默认的一个全局变量是具有外部链接属性的。而如果全局变量被static修饰,使得全局变量的外部链接属性变成了内部链接属性,这个时候这个全局变量只能在本源文件内部使用,其他源文件无法链接到,也无法使用。

  • 修饰函数用例

test 1 中写入一个Add函数:

int Add(int x, int y)
{return x + y;
}

test 2写入如下代码:

extern int Add(int x,int y)
int main()
{int a = 10;int b = 20;int c = Add(a, b);printf("%d\n", c);return 0;
}

这个函数可以正常调用。
但加上static修饰时:

static int Add(int x, int y)
{return x + y;
}

运行后:
运行结果
结论:函数是具有外部链接属性的,但如果被static修饰,外部链接属性就变成了内部链接属性,就不能在其他源文件中使用

3. define 定义的常量和宏

//define定义标识符常量
#define NUM 100//define定义宏
#define MAX(X,Y) (X>Y?X:Y)
int main()
{printf("%d\n", NUM);int a = 10;int b = 20;int c = MAX(a , b);//这句代码,会被替换成宏体int c = (a > b ? a : b); int c = MAX(a+2, b);//如果是a+2,替换时替换成a+2,而不是一个整体int c = (a+2> b ? a+2 : b); printf("%d\n", c);return 0;
}

总结

所有知识仅为了解,之后再仔细学习。


  1. 是将某一数值赋给某个变量的过程。 ↩︎

这篇关于(学习记录)C 0003——简单的了解C语言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899841

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06