C语言基础语法

时游大约 3 分钟

C 语言基础语法

配套Demo:codes/01_基础.c

程序基本结构

#include <stdio.h>   // 预处理指令,引入标准输入输出头文件

int main()           // 主函数,程序入口,int 为返回值类型
{
    printf("hello world\n");
    return 0;        // 返回值 0 表示程序正常结束
}

编译运行(以 gcc 为例):

gcc 01_基础.c -o hello   # 编译
./hello                  # 运行

数据类型和表达式

C 语言中的二进制、八进制和十六进制的表示:

  • 二进制:由 0 和 1 组成,使用时必须得用 0b 或 0B 开头,例如 0b0001
  • 八进制:由 0 ~ 7 八个数字组成,使用时必须以 0 开头,例如 015(十进制为 13)
  • 十六进制:由 0 ~ 9、A ~ F 或 a ~ f 组成,使用时必须以 0X 或 0x 开头,例如 0X2A(十进制 42)

基本数据类型

  • 整型 int
  • 字符型 char
  • 浮点型
    1. 单精度型 float
    2. 双精度型 double
  • 枚举类型

下列表格为详细说明(以 64 位系统常见实现为例):

类型类型说明符字节数字范围
字符型char1-128 ~ 127
短整型short int2-32768 ~ 32767
基本整型int4-2147483648 ~ 2147483647
长整型long int8约 ±9.2 × 10^18
无符号整型unsigned int40 ~ 4294967295
无符号长整型unsigned long80 ~ 约 1.8 × 10^19
单精度实型float4约 6 ~ 7 位有效数字
双精度实型double8约 15 ~ 16 位有效数字

各类型的实际字节数可用 sizeof(int) 运算符验证,标准只规定了各类型之间的相对大小关系。

常量与变量

int age = 18;                  // 变量:先定义后使用
const double PI = 3.14159;     // const 常量:定义后不可修改
#define MAX_SIZE 100           // 宏常量:预处理阶段直接文本替换

int octal = 015;               // 八进制 13
int hex = 0X2A;                // 十六进制 42
char c = 'A';                  // 字符本质是 ASCII 码,'A' 即 65
float f = 3.14f;               // float 字面量加 f 后缀
long l = 123456789L;           // long 字面量加 L 后缀

运算符

  1. 算术运算符:+ - * / %(两个整数相除结果取整,% 只能用于整数)
  2. 关系运算符:> >= < <= == !=(结果为 1 或 0)
  3. 逻辑运算符:&& || !(短路求值:&& 左边为假时右边不再计算)
  4. 位运算符:& | ^ ~ << >>
  5. 自增自减:++i(先加后用)、i++(先用后加)
  6. 三目运算符:条件 ? 表达式1 : 表达式2
  7. 逗号表达式:(a = 1, b = 2, a + b),结果为最后一个表达式的值
int a = 7, b = 2;
printf("%d\n", a / b);        // 3,整数除法截断小数
printf("%d\n", a % b);        // 1
printf("%d\n", a >> 1);       // 3,右移一位相当于除 2
printf("%d\n", 1 << 10);      // 1024,左移一位相当于乘 2

输入输出

printf 输出

格式符说明格式符说明
%d十进制整数%f浮点数(默认6位)
%c单个字符%lfdouble
%s字符串%x十六进制整数
%o八进制整数%p指针地址
%u无符号十进制%e科学计数法
%ldlong 整数%%输出 % 本身
printf("%5d\n", 42);      // 宽度5,右对齐:   42
printf("%-5d|\n", 42);    // 左对齐:42   |
printf("%.2f\n", 3.14159);// 保留两位小数:3.14

scanf 输入

int a;
double d;
char s[20];
scanf("%d", &a);          // 普通变量必须取地址 &
scanf("%lf", &d);         // double 用 %lf,printf 输出时用 %f
scanf("%s", s);           // 数组名本身就是地址,不加 &

字符输入输出

char c = getchar();       // 读取单个字符
putchar(c);               // 输出单个字符

类型转换

// 自动转换:小类型向大类型提升
int i = 3;
double d = i + 1.5;       // i 先提升为 double 再相加,结果 4.5

// 强制转换
int a = (int)3.99;        // 3,直接截断小数,不是四舍五入
printf("%d\n", (int)'A'); // 65
Loading...