c语言基础(一)

直接例子开始

两种编写 helloworld 的方式:

  1. 借助VS编辑工具 编写。 创建项目 --> 创建 helloworld.c 源文件 --> 写 helloworld程序 --> Ctrl + F5 执行。
  2. 借助记事本、gcc编译工具编写。
  • gcc编译工具的环境变量配置:
  • 在QT的安装目录中找 gcc.exe 目录位置。例如:C:\Qt\Qt5.5.0\Tools\mingw492_32\bin
    • 我的电脑 -->属性 --> 高级系统设置 --> 环境变量 -->系统环境变量 --> path --> 将gcc.exe目录位置写入到 path的值中。
  • 使用记事本创建helloworld.c 文件 --> 在记事本中写helloworld 程序 --> 使用cc编译工具 ,在记事本写的helloworld.c 所在目录中,执行 gcc helloworld.c -o myhello.exe --> 在终端(黑窗口)中,运行 :myhello.exe

编写helloworld程序

c 复制代码
// #include的意思是头文件包含,#include <stdio.h>代表包含stdio.h这个头文件
#include<stdio.h> // 所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
#include<conio.h>
#include<stlib.h>

int main(void) // int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式
{
    printf("hello world"); // 可以通过man 3 printf查看printf所需的头文件
    // system("pause"); // system函数的作用:在已经运行的程序中执行另外一个外部程序
	// _getch();
	return 0; // C语言每句可执行代码都是" **;** "分号结尾
}

解决exe文件执行的时候提示窗一闪而过的问题

  1. 通过system()函数解决: 在 return 0;之前 添加system("pause");函数调用。
  2. 使用_getch()等待下次输入。
  3. 借助VS工具解决: 在项目上 --->右键 ---> 属性 ---> 配置属性 ---> 连接器 ---> 系统 ---> 子系统 ---> 在下拉框中选择控制台 (/SUBSYSTEM:CONSOLE)

关于注释

  • 单行注释://
  • 多行注释:/* 注释内容 */
    • 不允许嵌套使用。 多行中可嵌套单行。

system 函数

  • 执行系统命令。如: pause、cmd、calc、mspaint、notepad.....
  • system("cmd"); system("calc");
  • 清屏命令:cls; system("cls");

gcc编译4步骤:【重点】预处理->编译->汇编->链接

  1. 预处理 -E xxx.i 预处理文件

gcc -E xxx.c -o xxx.i 注意这里是.c而不是.cpp

lua 复制代码
1. 头文件展开。 --- 不检查语法错误。 可以展开任意文件。

2. 宏定义替换。 --- 将宏名替换为宏值。

3. 替换注释。	--- 变成空行

4. 展开条件编译 --- 根据条件来展开指令。
  1. 编译 -S xxx.s 汇编文件

gcc -S hello.i -o hello.s

markdown 复制代码
1. 逐行检查语法错误。【重点】	--- 整个编译4步骤中最耗时的过程。

2. 将C程序翻译成 汇编指令,得到.s 汇编文件。
  1. 汇编 -c xxx.o 目标文件

gcc -c hello.s -o hello.o

markdown 复制代码
1. 翻译:将汇编指令翻译成对应的 二进制编码。
  1. 链接 无 xxx.exe 可执行文件。

gcc hello.o -o hello.exe

markdown 复制代码
1. 数据段合并

2. 数据地址回填

3. 库引入
过程 命令
预处理 gcc -E hello.c -o hello.i
编 译 gcc -S hello.i -o hello.s
汇 编 gcc -c hello.s -o hello.o
链 接 gcc hello.o -o hello
选项 含义
---------- ----------------
-E 只进行预处理
-S(大写) 只进行预处理和编译
-c(小写) 只进行预处理、编译和汇编
-o file 指定生成的输出文件名为 file
文件后缀 含义
------------ ------------
.c C 语言文件
.i 预处理后的 C 语言文件
.s 编译后的汇编文件
.o 编译后的目标文件

调试程序:

rust 复制代码
添加行号:
    工具--> 选项 --> 文本编辑器--> C/C++ --> 行号 选中。
  1. 设置断点。F5启动调试
  2. 停止的位置,是尚未执行的指令。
  3. 逐语句执行一下条 (F11):进入函数内部,逐条执行跟踪。
  4. 逐过程执行一下条 (F10):不进入函数内部,逐条执行程序。
  5. 添加监视: 调试 --> 窗口 --> 监视:输入监视变量名。自动监视变量值的变化。

C语言的特点

  • 优点
    • 代码量小
    • 执行速度快
    • 功能强大
    • 编程自由
  • 缺点
    • 写代码实现周期长
    • 可移植性较差
    • 过于自由,经验不足易出错
    • 对平台库依赖较多

c语言应用

c语言中的32个关键字

  • 常见的
arduino 复制代码
break case const continue default do else enum for if return static switch void while
  • 不常见的
objectivec 复制代码
auto char double extern float goto int long register 
signed sizeof struct typedef unsigned union volatile

关于gcc

plaintext 复制代码
gcc(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程语言编译器。
gcc原本作为GNU操作系统的官方编译器,
现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,
gcc同样适用于微软的Windows。
编译命令格式:
gcc [-option1] ... <filename>
g++ [-option1] ... <filename>
可执行文件的文件名会自动生成一个默认名,Linux平台为[a.out],Windows平台为[a.exe]

include

#include< > 与 #include ""的区别:

  1. < > 表示系统直接按系统指定的目录检索
  2. "" 表示系统先在 "" 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索

64位和32位系统

  1. 所有的64位CPU兼容32位的指令,32位要兼容16位的指令,所以在64位的CPU上是可以识别32位的指令
  2. 在64位的CPU构架上运行了64位的软件操作系统,那么这个系统是64位
  3. 在64位的CPU构架上,运行了32位的软件操作系统,那么这个系统就是32位 !!64位的软件不能运行在32位的CPU之上

寄存器

8位 16位 32位 64位
A AX EAX RAX
B BX EBX RBX
C CX ECX RCX
D DX EDX RDX

c语言嵌套汇编语言

c 复制代码
#include <stdio.h>

int main()
{
    //定义整型变量a, b, c
    int a;
    int b;
    int c;

    __asm
    {
        mov a, 3 //3的值放在a对应内存的位置
        mov b, 4 //4的值放在b对应内存的位置
        mov eax, a //把a内存的值放在eax寄存器
        add eax, b //eax和b相加,结果放在eax
        mov c, eax //eax的值放在c中
    }
    printf("%d\n",  c);//把c的值输出
    return 0;//成功完成
}

集成开发环境IDE

集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。

Microsoft Visual Studio常用快捷键

快捷键 含义
Ctrl + k,Ctrl + f 自动格式化代码
Ctrl + k,Ctrl + c 注释代码
Ctrl + k,Ctrl + u 取消注释代码
F9 设置断点
F5 调试运行
Ctrl + F5 不调试运行
Ctrl + Shift + b 编译,不运行
F10 next调试
F11 step调试
相关推荐
过过过呀Glik1 小时前
在 Ubuntu 上安装 Muduo 网络库的详细指南
linux·c++·ubuntu·boost·muduo
蜀黍@猿2 小时前
【C++ 基础】从C到C++有哪些变化
c++
Am心若依旧4092 小时前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
zh路西法2 小时前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(一):从电梯出发的状态模式State Pattern
c++·决策树·状态模式
轩辰~2 小时前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
lxyzcm2 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
蜀黍@猿3 小时前
C/C++基础错题归纳
c++
雨中rain3 小时前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
ALISHENGYA4 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战项目二)
数据结构·c++·算法
arong_xu4 小时前
现代C++锁介绍
c++·多线程·mutex