C语言:从底层到AI的编程核心

从1960年的ALGOL 60 到1970年的BCPL再到1971年的B语言,编程也从计算机设计者的个人工作逐渐转变到专门的一项工作,C语言的发展,无疑给这个行业注入了核心,至此,C语言作为一门可以从底层控制用到用户界面的编程语言得到了广大编程工作者的支持。C语言作为计算机编程的核心语言,经历岁月洗礼,但其地位仍旧不可撼动。

从stm32单片机的控制到人工智能大模型的运行,C语言在其中发挥着不可或缺的作用,无数的高级语言也从C语言的肩膀上站起来。C语言,依旧是我们值得学习的编程语言。

一、关于数据

(一) 计算机存储的数据是怎么样的?

大部分人都知道,通用计算机都是基于二进制设计的(据说苏联曾经有三级制的),在二进制中,存在原码、反码、补码三种形式(这里不展开细节部分),而常见的英文、数字等就是通过ASCII码转换为数字存储在计算机中的。

(二) C语言的数据类型有哪些?

在C语言中,基本的有整型、浮点型、字符型三种类型,这三种分别可分为有符号和无符号两种,而整型还可分为长整型、短整型、双长整型,浮点型可分为单精度浮点型、双精度浮点型。而在C语言中,还有数组、指针等高级类型,数组是将一组基本类型相同的值放在一块连续的空间构成的,可以有多个维度(参考表格),而指针是一种指向数据地址的值,即指针就是数据的地址(参考按针眼穿针)。

(三) C语言中的量有哪些?

在C语言中,分为变量和常量,其中还有多种分类,如一次定义就不可改变的const常量,定义后空间不进行收回的static变量等

二、关于运算符

在C语言中,含有多种运算符,如下:

(一) 算术运算符(A=1,B=2)

运算符描述实例
+把两个操作数相加A + B 将得到 3
-从第一个操作数中减去第二个操作数A - B 将得到 -1
*把两个操作数相乘A * B 将得到 2
/分子除以分母B / A 将得到 2
%取模运算符,整除后的余数B % A 将得到 0
++自增运算符,整数值增加 1A++ 将得到 2
自减运算符,整数值减少 1A-- 将得到 0

(二) 关系运算符

运算符描述实例
==检查两个操作数的值是否相等,如果相等则条件为真。(A == B) 为假。
!=检查两个操作数的值是否相等,如果不相等则条件为真。(A != B) 为真。
>检查左操作数的值是否大于右操作数的值,如果是则条件为真。(A > B) 为假。
<检查左操作数的值是否小于右操作数的值,如果是则条件为真。(A < B) 为真。
>=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。(A >= B) 为假。
<=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。(A <= B) 为真。

(三) 逻辑运算符

运算符描述实例
&&称为逻辑与运算符。如果两个操作数都非零,则条件为真。(A && B) 为假。
|称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。(A | B) 为真。
!称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。!(A && B) 为真。

(四) 位运算符(按二进制的位)(A=10,B=20)

运算符描述实例
&对两个操作数的每一位执行逻辑与操作,如果两个相应的位都为 1,则结果为 1,否则为 0。按位与操作,按二进制位进行"与"运算。运算规则:

0&0=0;
0&1=0;
1&0=0;
1&1=1;
(A & B) 将得到 0,即为 0000 0000
|对两个操作数的每一位执行逻辑或操作,如果两个相应的位都为 0,则结果为 0,否则为 1。按位或运算符,按二进制位进行"或"运算。运算规则:

0|0=0;
0|1=1;
1|0=1;
1|1=1;
(A | B) 将得到 30,即为 0001 1110
^对两个操作数的每一位执行逻辑异或操作,如果两个相应的位值相同,则结果为 0,否则为 1。异或运算符,按二进制位进行"异或"运算。运算规则:

0^0=0;
0^1=1;
1^0=1;
1^1=0;
(A ^ B) 将得到 30,即为 0001 1110
~对操作数的每一位执行逻辑取反操作,即将每一位的 0 变为 1,1 变为 0。取反运算符,按二进制位进行"取反"运算。运算规则:

~1=-2;
~0=-1;
(~A ) 将得到 -10,即为 1111 0110,一个有符号二进制数的补码形式。
<<将操作数的所有位向左移动指定的位数。左移 n 位相当于乘以 2 的 n 次方。二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。A << 2 将得到 40,即为 0010 1000
>>将操作数的所有位向右移动指定的位数。右移n位相当于除以 2 的 n 次方。二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补 0,负数左补 1,右边丢弃。A >> 3 将得到 1,即为 0000 0001

(五)赋值运算符

运算符描述实例
=简单的赋值运算符,把右边操作数的值赋给左边操作数C = A + B 将把 A + B 的值赋给 C
+=加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数C += A 相当于 C = C + A
-=减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数C -= A 相当于 C = C - A
*=乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数C *= A 相当于 C = C * A
/=除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数C /= A 相当于 C = C / A
%=求模且赋值运算符,求两个操作数的模赋值给左边操作数C %= A 相当于 C = C % A
<<=左移且赋值运算符C <<= 2 等同于 C = C << 2
>>=右移且赋值运算符C >>= 2 等同于 C = C >> 2
&=按位与且赋值运算符C &= 2 等同于 C = C & 2
^=按位异或且赋值运算符C ^= 2 等同于 C = C ^ 2
|=按位或且赋值运算符C |= 2 等同于 C = C | 2

(六) 其他运算符

运算符描述实例
sizeof()返回变量的大小。int a;sizeof(a) 将返回 4,其中 a 是整数。
&返回变量的地址。&a; 将给出变量的实际地址。
*指向一个变量。*a; 将指向一个变量。
? :条件表达式如果条件为真 ? 则值为 X : 否则值为 Y

三、关于基本结构

在C语言中,有三大基本结构,这些结构保证了C语言的规范工整、程序的易读性:

(一)顺序结构

顺序结构是最为基础的结构,根据名字我们就可以知道就是按顺序执行就可以了。

#include <stdio.h> //这是编译预处理指令 int main () //定义主函数 { //函数开始的标志 printf_s("Hello World!1\n"); //输出所指定的一行信息 printf_s("Hello World!2\n"); //输出所指定的一行信息 printf_s("Hello World!3\n"); //输出所指定的一行信息 printf_s("Hello World!4\n"); //输出所指定的一行信息 return 0; //函数执行完毕时返回函数值0 } //函数结束的标志

上面的程序就是一个标准的顺序结构的程序,读者可以输入到IDE中进行调试验证,程序按照顺序分别执行输出。

(二) 选择结构

选择结构通过一个判断语句来判断应该执行的代码块,一般用if…else…语句来执行

#include <stdio.h> int main() { int a=10,b=0; if(a==10){ a=a+1;b=b+1;} else {a=a+4;b=b+4;} printf_s("%d,%d\n",a,b); return 0; }

通过修改a的值,我们发现程序执行了不同的代码块,让程序的执行更加灵活多变,当然我们也可以多分支判断,当然我们可以在else中再次使用if…else…语句块,然而,我们有更优雅的实现:

#include <stdio.h> #include <math.h> int main() { double a,b,c,disc,p,q; printf_s("\n请输入一元二次方程的系数(空格间隔)"); scanf_s("%lf%lf%lf",&a,&b,&c); p=-b/(2.0*a); disc=b*b-4*a*c; q=(disc>=0?sqrt(disc):sqrt(-disc))/(2.0*a); if(disc<0) printf_s("\n方程有两个虚根:x1=%7.2f+%7.2fi,x2=%7.2f-%7.2fi",p,q,p,q); else if(0==disc) printf_s("方程有两个相等实根:\nx=%7.2f",p); else printf_s("方有两个不相等程实根:\nx1=%7.2f\nx2=%7.2f\n",p+q,p-q); return 0; }

通过else if我们实现更加整齐的代码书写,便于阅读,但如果分支多起来,这个方案显然不是特别合适,当然,我们有更好的switch…case…语句来实现:

#include <stdio.h> #include<ctype.h> #include <math.h> int main() { char gradeChar='\0'; float hundredScore=0; printf_s("\n请输入五级成绩等级(A|B|C|D|E):"); gradeChar=islower(gradeChar=getchar())?gradeChar-32:gradeChar; switch (gradeChar) { case 'A': hundredScore=90; break; case 'B': hundredScore=85; break; case 'C': hundredScore=75; break; case 'D': hundredScore=65; break; case 'E': hundredScore=50; break; default: hundredScore=0; break; } if(fabs(hundredScore)<1e-10) printf_s("\n输入数据错误!"); else printf_s("\n百分制成绩:%.2f",hundredScore); return 0; }

这样的代码如果用if…else…来书写的话就非常麻烦,而如果使用switch语句来书写,显然提高了编码效率,也便于理解。

(三) 循环结构

在C语言中,为了减少内存的占用并且提高编程的效率,我们一般使用循环结构来重复处理相似的任务:

#include <stdio.h> int main() { int sum=0,i=1,n=0; printf_s("请输入n的值:"); scanf_s("%d",&n); while(i<n){ if(i%3==0){ sum=sum+i; i++; } else i++; } printf_s("\n和是:%d",sum); return 0; }

通常我们使用while循环来实现先判断后执行的简单代码,但注意不要编码出死循环的程序!

当然我们也有更好的循环结构:

#include <stdio.h> int main() { int sum=0,i=1; int n=0; printf_s("请输入n的值:"); scanf_s("%d",&n); for(int i=1;i<=n;i++) sum=sum+i; printf_s("%d!的值是%d。",n,sum); return 0; }

使用for循环将初始化语句和相同的变量语句放入括号内,使代码更加简洁,更易于阅读和修改,当然我们还有一种循环结构:

#include <stdio.h> int main() { int sum=0,i=1; int n=0; printf_s("请输入n的值:"); scanf_s("%d",&n); do{ sum=sum+i; i++; }while(i<=n); printf_s("%d!的值是%d。",n,sum); return 0; }

do…while…循环的好处在于保证代码块至少执行一次,其他与while几乎没有区别。

四、关于函数

在C语言中,用户可以自定义函数来简化流程,方便使用:

#include <stdio.h> int aaa(char *s) { char *t = s; while (*t++); t--; return (t - s); } int main() { char s[10] = "abcdefghi"; printf("%d", aaa(s)); return 0; }

我们定义的aaa函数如果写在main函数的后面,要先在main函数前面声明,不然会报错的!

(关于指针等内容由于繁多,不在本篇展开)

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

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

相关文章

eclipse4.7 droolsjbpm-tools-distribution-7.46.0.Final.zip

eclipse4.7 工作流插件droolsjbpm-tools-distribution-7.46.0.Final.zip网络不好&#xff0c;就没法子直接更新&#xff0c;经常中断下载离线安装包&#xff0c;更新

ARM汇编基础

GNU汇编语法 GNU 汇编语法适用于所有的架构&#xff0c;并不是 ARM 独享的&#xff0c; GNU 汇编由一系列的语句组成&#xff0c; 每行一条语句&#xff0c;每条语句有三个可选部分&#xff0c;如下&#xff1a; label&#xff1a; instruction commentlabel 即标号&#xf…

2026年想找高质量简历模板就来这7个网站

在求职过程中&#xff0c;一份“长得好看”且专业的简历永远是第一块敲门砖。 无论你是追求极简商务风的金融精英&#xff0c;还是需要展示创意的设计师&#xff0c;一个高质量的简历模板都能帮你省去繁琐的排版时间&#xff0c;直接提升简历的“颜值”和阅读体验。很多人空有满…

7款AI工具助力学术论文高效撰写的详细解析

工具核心特点速览 工具名称 核心优势 适用场景 数据支撑 aibiye 全流程覆盖降重优化 从开题到答辩的一站式需求 支持20万字长文逻辑连贯 aicheck 院校规范适配模板化输出 国内本硕博论文框架搭建 覆盖90%高校格式要求 秒篇 3分钟文献综述生成 紧急补文献章节 知…

基于栅格地图的人工势场法动态路径规划:探索与实践

基于珊格地图的人工势场法 动态路径规划 路径规划算法 地图好修改 自己研究编写的Matlab路径规划 可自行设置起始点&#xff0c;目标点&#xff0c;自由更换地图。 ——————————————————— 可以和A*和RRT融合 动态障碍物 在机器人领域&#xff0c;路径规划始终…

主流简历模板平台测评:5大工具,覆盖从创意到技术的全场景求职

在2026年的数字化招聘中&#xff0c;简历已从单向的展示材料&#xff0c;演变为必须同时适配招聘官阅读与ATS&#xff08;申请人追踪系统&#xff09;筛选的“双向工具”。选择专业模板的核心价值在于通过优化信息呈现&#xff0c;直接提升简历的通过效率&#xff0c;具体依据如…

Java面试场景:深入探讨Spring Boot与微服务架构应用

Java面试场景&#xff1a;深入探讨Spring Boot与微服务架构应用 场景描述 在一家互联网大厂的面试场景中&#xff0c;小白程序员“超好吃”面试Java开发岗位。面试官是一位严肃但不失温和的技术专家&#xff0c;整个面试过程由三轮提问组成&#xff0c;涉及Spring Boot、微服务…

天然蛋白纯化技术:原理与核心层析策略

天然蛋白纯化技术:原理与核心层析策略天然蛋白纯化是从复杂生物样本中获取具有完整天然构象与生物活性蛋白质的关键生物化学技术。与重组蛋白表达系统获得的蛋白质相比,天然蛋白直接来源于生物组织或体液,其翻译后修…

Matlab 中用蒙特卡洛算法模拟电动汽车充电负荷

在matlab中用蒙特卡洛算法对电动汽车充电负荷进行模拟&#xff0c;可自己修改电动汽车数量&#xff0c;论文复现。 参考论文:基于V2G的电动汽车充放电优化调度策略 有注释简单易懂&#xff0c;可随意调整参数。 最近在研究电动汽车充电负荷相关问题&#xff0c;发现基于蒙特卡洛…

揭秘主流AI大模型的系统提示词,助你掌握AI核心技术

文章介绍了7个热门开源项目&#xff0c;重点分享了主流AI大模型(如ChatGPT、Claude、Gemini)的系统提示词合集&#xff0c;这些隐藏提示词对AI行为起关键引导作用。同时推荐了电子书转有声书、项目管理、AI嵌入数据库、生成式BI工具和微虚拟机等实用工具&#xff0c;为开发者提…

我基于大模型写了个Telegram群反垃圾广告机器人

我基于大模型写了个Telegram群反垃圾广告机器人一、为什么要做这个Bot 维护Telegram群组的朋友应该都遇到过类似问题:群里突然冒出一堆广告,机器人批量加群发垃圾信息,正常讨论都被打断。最头疼的是,管理员每天要花…

金融大模型落地提速170%,2025前三季度数据揭秘银行、证券、保险应用趋势与厂商竞争格局

2025年前三季度金融行业大模型中标项目数量同比增长170%&#xff0c;金额增长298%。银行是主要应用主体(占比51.1%)&#xff0c;算力类项目金额占比最大&#xff0c;应用类项目数量最多&#xff0c;主要场景为智能客服、知识问答等。百度、火山引擎、科大讯飞是市场领先厂商&am…

35岁程序员必看!大模型转型全攻略+学习资源,收藏这篇就够了!

35岁程序员面临职业转型十字路口时&#xff0c;大模型作为当下最热门的技术赛道&#xff0c;无疑是极具吸引力的选择。但跨领域转型并非易事&#xff0c;需要系统规划与稳步推进。以下是专为35岁程序员量身定制的大模型领域转行落地步骤&#xff0c;兼顾基础入门与技能衔接&…

P8145 [JRKSJ R4] kth

锻炼自己的思维链优化能力。 首先比较容易想到设 \(f_{i, j}\) 为从 \(i\) 开始走 \(j\) 步有多少种方案,有一个基于字典序贪心搜索的 \(O(nm)\) 解法。 发现一个事情,\(f_{p_1, m}\) 的大小接近 \(2^m\) 级别,这是…

CodeFuse大模型学习手册:从自然语言到代码的精准转化,小白也能快速上手(值得收藏)

CodeFuse是蚂蚁集团自研的代码大模型&#xff0c;支持40余种编程语言&#xff0c;可实现从自然语言到代码的精准转化&#xff0c;覆盖软件开发全生命周期。其"图生代码"功能能将设计图一键转化为代码&#xff0c;将前端开发效率从小时级提升至秒级。CodeFuse在多个技…

AI助力学术写作:7款工具使用指南与示例

工具核心特点速览 工具名称 核心优势 适用场景 数据支撑 aibiye 全流程覆盖降重优化 从开题到答辩的一站式需求 支持20万字长文逻辑连贯 aicheck 院校规范适配模板化输出 国内本硕博论文框架搭建 覆盖90%高校格式要求 秒篇 3分钟文献综述生成 紧急补文献章节 知…

2026年1月AI搜索优化服务商哪家靠谱?技术vs交付能力vs效果三维测评

2026年AI搜索流量已成为企业数字营销的核心战场,豆包、Kimi、DeepSeek等主流平台日均搜索请求量突破9亿次,78%的用户在做出购买决策前会通过AI平台获取产品信息与品牌对比。在此背景下,"AI搜索优化哪家靠谱&qu…

AI应用开发进入工程时代:从千问到评测革命的完整指南(建议收藏)

文章探讨了AI应用开发从实验室阶段进入工业化阶段的关键转折&#xff0c;分析了入口战争&#xff08;千问与豆包的生态路径对决&#xff09;、评测革命&#xff08;从结果评估到过程评估&#xff09;、推理侧缩放&#xff08;重思考模式与智能体工程化&#xff09;以及底层信号…

学术论文AI写作:7款工具操作技巧与案例解析

工具核心特点速览 工具名称 核心优势 适用场景 数据支撑 aibiye 全流程覆盖降重优化 从开题到答辩的一站式需求 支持20万字长文逻辑连贯 aicheck 院校规范适配模板化输出 国内本硕博论文框架搭建 覆盖90%高校格式要求 秒篇 3分钟文献综述生成 紧急补文献章节 知…

2个月构建医学知识库:RAG技术实战全解析 | 程序员必看的大模型应用指南

本文记录了作者历时两个月构建医学知识库的完整历程&#xff0c;从朴素RAG到多路召回RAG的三次迭代尝试&#xff0c;最终选择Dify平台结合硅基流动API服务实现。过程中解决了本地模型资源不足、API配置和延迟等技术难题&#xff0c;总结出文本预处理质量大于算法花哨度、混合检…