UCAS CTF

C 语言基础

Author: jiuhao47

基础变量类型

整型

int a = 10;
int 类型的变种

包括 intshortlonglong long,以及它们的无符号版本 unsigned intunsigned shortunsigned longunsigned long long

int var_int;  
short var_short; 
long var_long; 
long long var_long_long;  
unsigned int var_unsigned_int; 
unsigned short var_unsigned_short; 
unsigned long var_unsigned_long; 
unsigned long long var_unsigned_long_long; 

浮点型

float b = 3.14;
浮点型的变种

包括 floatdoublelong double

float var_float; 
double var_double; 
long double var_long_double;

字符型

char c = 'A';
字符型的变种

char,以及它的无符号版本 unsigned char

char var_char; 
unsigned char var_unsigned_char; 

其他基本变量类型

bool(需要包含头文件 stdbool.h)。

#include <stdbool.h>
bool var_bool; 

void,主要用在函数返回值和参数中,表示无值或任意类型。

void func1();

enum,用于定义在程序中只能取一定范围内的值的类型。

enum color { red, green, blue };
enum color var_color;

变量-内存

语句

a = b + c;
a = a + 1;
其他的语句样式
int a,b,c;
a=b=c=1;
1;
a;
a+b;
a+=c;
a++;
a,b,c;
;
a+=a,b,c++;

注释

// 单行注释

/*
多行注释
*/

运算符

更多运算符
  • 位运算符:&, |, ^, ~, «, »
    • &: 与
    • |: 或
    • ^: 异或
    • ~: 取反
    • «: 左移
    • >>: 右移
  • 逻辑运算符:&&, ||, !
    • &&: 与
    • ||: 或
    • !: 非
  • 赋值运算符:=, +=, -=, *=, /=, %=
    • +=: 加后赋值
    • -=: 减后赋值
    • *=: 乘后赋值
    • /=: 除后赋值
    • %=: 取余后赋值
  • 其他运算符:sizeof, ?:, &, *, ->, .
    • sizeof: 计算数据类型的大小
    • ?:: 三目运算符
    • &: 取地址
    • *: 取值
    • ->: 结构体指针访问成员

基础库函数

printf()

printf("Hello, World!\n");

int a = 10;
printf("a = %d\n", a);

float b = 3.14;

printf("b = %f\n", b);

char c = 'A';

printf("c = %c\n", c);

scanf()

int a;
scanf("%d", &a);

float b;
scanf("%f", &b);

char c;
scanf("%c", &c);

getchar()

char c = getchar();

putchar()

putchar('A');

char c = getchar();
putchar(c);

示例程序——加法计算器

#include <stdio.h>
int main()
{
    int a, b;
    printf("请输入两个整数:");
    scanf("%d %d", &a, &b);
    printf("%d + %d = %d\n", a, b, a + b);
    return 0;
}

条件与循环

条件语句

if 语句

if (condition) {
    // code
}

if-else 语句

if (condition) {
    // code
} else {
    // code
}

if-else if-else 语句

if (condition1) {
    // code
} else if (condition2) {
    // code
} else {
    // code
}
条件语句的嵌套
if (condition1) {
    if (condition2) {
        // code
    } else {
        // code
    }
} else {
    // code
}
不完整条件语句
if (condition1) {
    // code
}
else if(condition2) {
    // code
}

流程图/控制流图

流程图

[控制流图](https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E6%B5%81%E5%9C%96)

示例程序——加、减、乘计算器

#include <stdio.h>
int main()
{
    int a, b;
    printf("请输入两个整数:");
    scanf("%d %d", &a, &b);
    char op;
    printf("请输入运算符:");
    scanf("%c", &op);
    if (op == '+') {
        printf("%d + %d = %d\n", a, b, a + b);
    } else if (op == '-') {
        printf("%d - %d = %d\n", a, b, a - b);
    } else if (op == '*') {
        printf("%d * %d = %d\n", a, b, a * b);
    } else {
        printf("不支持的运算符\n");
    }
    return 0;
}

循环语句

while 循环

while (condition) {
    // code
}

do-while 循环

do {
    // code
} while (condition);
while 和 do-while 的区别
int i = 0;
while (i > 0) {
    printf("%d\n", i);
    i++;
}
// 不会输出任何内容

int j = 0;
do {
    printf("%d\n", j);
    j++;
} while (j > 0);

// 会循环输出0, 1, 2, ... 

// do-while 会先执行一次循环体,再判断循环条件
// while 先判断循环条件,再执行循环体

for 循环

for (init; condition; increment) {
    // code
}
// init: 循环变量初始化,只在循环开始时执行一次,e.g. int i = 0;
// condition: 循环条件,每次循环开始前判断,为真则执行循环体,为假则跳出循环,e.g. i < 10;
// increment: 循环变量增量,每次循环结束后执行,e.g. i++;

// 示例
for (int i = 0; i < 10; i++) {
    // code
}
循环语句的嵌套
for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        // code
    }
}
死循环
for (;;) {
    // code
}

while (1) {
    // code
}

do {
    // code
} while (1);

示例程序——1-10000的累加

#include <stdio.h>
int main()
{
    int sum = 0;
    for (int i = 1; i <= 10000; i++) {
        sum += i;
    }
    printf("1 + 2 + ... + 10000 = %d\n", sum);
    return 0;
}

跳转语句

break 语句

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break;
        // 从这里跳出整个循环
    }
    printf("%d\n", i);
}

continue 语句

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        continue;
        // 从这里跳出本轮循环
    }
    printf("%d\n", i);
}

goto 语句

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        goto end;
        // 跳转到标签end
    }
    printf("%d\n", i);
}
end: