提供基本语法和方法的 C 快速参考备忘单。
printf("I am learning C.");
int testInteger = 5;
printf("Number = %d", testInteger);
float f = 5.99; // 浮点数
printf("Value = %f", f);
short a = 0b1010110; // 2 进制数字
int b = 02713; // 8 进制数字
long c = 0X1DAB83; // 16 进制数字
// 以 8 进制形似输出
printf("a=%ho, b=%o, c=%lo\n", a, b, c);
// 输出 => a=126, b=2713, c=7325603
// 以 10 进制形式输出
printf("a=%hd, b=%d, c=%ld\n", a, b, c);
// 输出 => a=86, b=1483, c=1944451
// 以 16 进制形式输出(字母小写)
printf("a=%hx, b=%x, c=%lx\n", a, b, c);
// 输出 => a=56, b=5cb, c=1dab83
// 以 16 进制形式输出(字母大写)
printf("a=%hX, b=%X, c=%lX\n", a, b, c);
// 输出 => a=56, b=5CB, c=1DAB83
int a1=20, a2=345, a3=700;
int b1=56720, b2=9999, b3=20098;
int c1=233, c2=205, c3=1;
int d1=34, d2=0, d3=23;
printf("%-9d %-9d %-9d\n", a1, a2, a3);
printf("%-9d %-9d %-9d\n", b1, b2, b3);
printf("%-9d %-9d %-9d\n", c1, c2, c3);
printf("%-9d %-9d %-9d\n", d1, d2, d3);
输出结果
20 345 700
56720 9999 20098
233 205 1
34 0 23
%-9d 中,d 表示以 10 进制输出,9 表示最少占 9 个字符的宽度,宽度不足以空格补齐,- 表示左对齐
char greetings[] = "Hello World!";
printf("%s", greetings);
访问字符串
char greetings[] = "Hello World!";
printf("%c", greetings[0]);
修改字符串
char greetings[] = "Hello World!";
greetings[0] = 'J';
printf("%s", greetings);
// 输出 "Jello World!"
另一种创建字符串的方法
char greetings[] = {'H','e','l','l','\0'};
printf("%s", greetings);
// 输出 "Hell!"
C 没有 String 类型,使用 char 类型并创建一个字符 array
int myNumbers[] = {25, 50, 75, 100};
printf("%d", myNumbers[0]);
// 输出 25
更改数组元素
int myNumbers[] = {25, 50, 75, 100};
myNumbers[0] = 33;
printf("%d", myNumbers[0]);
循环遍历数组
int myNumbers[] = {25, 50, 75, 100};
int i;
for (i = 0; i < 4; i++) {
printf("%d\n", myNumbers[i]);
}
设置数组大小
// 声明一个由四个整数组成的数组:
int myNumbers[4];
// 添加元素
myNumbers[0] = 25;
myNumbers[1] = 50;
myNumbers[2] = 75;
myNumbers[3] = 100;
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
定义枚举变量
enum week a, b, c;
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;
有了枚举变量,就可以把列表中的值赋给它
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
enum week a = Mon, b = Wed, c = Sat;
// 或者
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;
unsigned int a = 60; /* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
printf("Line 1 - c 的值是 %d\n", c );
c = a | b; /* 61 = 0011 1101 */
printf("Line 2 - c 的值是 %d\n", c );
c = a ^ b; /* 49 = 0011 0001 */
printf("Line 3 - c 的值是 %d\n", c );
c = ~a; /*-61 = 1100 0011 */
printf("Line 4 - c 的值是 %d\n", c );
c = a << 2; /* 240 = 1111 0000 */
printf("Line 5 - c 的值是 %d\n", c );
c = a >> 2; /* 15 = 0000 1111 */
printf("Line 6 - c 的值是 %d\n", c );
| 数据类型 | 大小 Size | 范围 Range | 描述 Description |
|---|---|---|---|
char | 1 字节 | −128 ~ 127 | 单个字符/字母/数字/ASCII |
signed char | 1 字节 | −128 ~ 127 | - |
unsigned char | 1 字节 | 0 ~ 255 | - |
int | 2 到 4 字节 | −32,768 ~ 32,767 | 存储整数 |
signed int | 2 字节 | −32,768 ~ 32,767 | |
unsigned int | 2 字节 | 0 ~ 65,535 | |
short int | 2 字节 | −32,768 ~ 32,767 | |
signed short int | 2 字节 | −32,768 ~ 32,767 | |
unsigned short int | 2 字节 | 0 ~ 65,535 | |
long int | 4 字节 | -2,147,483,648 ~ 2,147,483,647 | |
signed long int | 4 字节 | -2,147,483,648 ~ 2,147,483,647 | |
unsigned long int | 4 字节 | 0 ~ 4,294,967,295 | |
float | 4 字节 | ||
double | 8 字节 | ||
long double | 10 字节 |
// 创建变量
int myNum = 5; // 整数
float myFloatNum = 5.99; // 浮点数
char myLetter = 'D'; // 字符串
// 高精度浮点数据或数字
double myDouble = 3.2325467;
// 打印输出变量
printf("%d\n", myNum);
printf("%f\n", myFloatNum);
printf("%c\n", myLetter);
printf("%lf\n", myDouble);
| 数据类型 | 说 明 |
|---|---|
char | 字符型 |
short | 短整型 |
int | 整型 |
long | 长整型 |
float | 单精度浮点型 |
double | 双精度浮点型 |
void | 无类型 |
| 指令 | 描述 |
|---|---|
#define | 定义宏 |
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#if | 如果给定条件为真,则编译下面代码 |
#else | #if 的替代方案 |
#elif | 如果 #if 条件为假,当前条件为真 |
#endif | 结束一个 #if……#else 条件编译块 |
#error | 当遇到标准错误时,输出错误消息 |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 |
// 所有的 MAX_ARRAY_LENGTH 替换为 20
#define MAX_ARRAY_LENGTH 20
// 系统库中获取 stdio.h
#include <stdio.h>
// 本地目录中获取 myheader.h
#include "myheader.h"
#undef FILE_SIZE
#define FILE_SIZE 42 // 取消已定义并定义为 42
| 宏 | 描述 |
|---|---|
__DATE__ | 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量 |
__TIME__ | 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量 |
__FILE__ | 这会包含当前文件名,一个字符串常量 |
__LINE__ | 这会包含当前行号,一个十进制常量 |
__STDC__ | 当编译器以 ANSI 标准编译时,则定义为 1 |
ANSI C 定义了许多宏,您可以使用这些宏,但是不能直接修改这些预定义的宏
#include <stdio.h>
int main() {
printf("File :%s\n", __FILE__);
printf("Date :%s\n", __DATE__);
printf("Time :%s\n", __TIME__);
printf("Line :%d\n", __LINE__);
printf("ANSI :%d\n", __STDC__);
}
int main() {
printf("Hello World!");
return 0;
}
函数由两部分组成
void myFunction() { // 声明 declaration
// 函数体(要执行的代码)(definition)
}
Declaration 声明函数名称、返回类型和参数 (如果有)Definition 函数体 (要执行的代码)// 函数声明
void myFunction();
// 主要方法
int main() {
myFunction(); // --> 调用函数
return 0;
}
void myFunction() {// 函数定义
printf("晚上好!");
}
int myFunction(int x) {
return 5 + x;
}
int main() {
printf("结果: %d", myFunction(3));
return 0;
}
// 输出 8 (5 + 3)
两个参数
int myFunction(int x, int y) {
return x + y;
}
int main() {
printf("结果: %d", myFunction(5, 3));
// 将结果存储在变量中
int result = myFunction(5, 3);
printf("结果 = %d", result);
return 0;
}
// 结果: 8 (5 + 3)
// 结果 = 8 (5 + 3)
// 创建一个名为 myStructure 的结构
struct myStructure {
int myNum;
char myLetter;
};
int main() {
// 创建一个名为 s1 的 myStructure 结构变量
struct myStructure s1;
// 为 s1 的成员赋值
s1.myNum = 13;
s1.myLetter = 'B';
// 创建一个名为 s2 的 myStructure 结构变量
// 并为其赋值
struct myStructure s2 = {13, 'B'};
// 打印值
printf("My number: %d\n", s1.myNum);
printf("My letter: %c\n", s1.myLetter);
return 0;
}
创建不同的结构变量
struct myStructure s1;
struct myStructure s2;
// 为不同的结构变量赋值
s1.myNum = 13;
s1.myLetter = 'B';
s2.myNum = 20;
s2.myLetter = 'C';
安装 Docker
创建 Dockerfile 文件
FROM alpine:3.14
RUN apk add --no-cache gcc musl-dev
RUN apk add --no-cache g++
生成本地 myalpine 镜像
docker build -t myalpine .
运行映像,把当前路径 ($PWD) 映射至容器的 /test 目录,用 gcc 编译程序,exit返回
docker run -it -v $PWD:/test myalpine
root@b1a38bd7107a:/# cd test
root@b1a38bd7107a:/test# gcc -o hello hello.c
Hello World
root@b1a38bd7107a:/test# exit
exit