文章目录
数据类型
#define与const
#define | const |
---|---|
在预处理阶段起作用 | 在编译、运行时起作用 |
定义的常数是一个立即数,不带类型 | 定义的常数是变量,带类型 |
占用代码段空间 | 占用数据段空间 |
每次替换都会在内存中生成备份 | 只会生成一个备份,节省了内存空间 |
预编译时便已替换,无法调试 | 可以调试 |
此外
#define作为一个简单的字符串替换,会导致边界效应
#include <stdio.h>
#define X 1
#define Y X+2
#define Z X/Y*3
int main() {
printf("Z:%d\n", Z);
//你以为:Z = X/Y*3 = 1/3*3 = 1
//实际上:Z = X/Y*3 = X/X + 2*3 = 1/1 + 2*3 = 7
//正确写法:#define Y (X+2)
return 0;
}
const由于存储在数据段,是一个伪常量,即一个限定修改的变量,因此无法用于数组初始化以及全局变量的初始化
#include <stdio.h>
int main() {
const int x = 1;
//直接赋值会报错:
//[Error] assignment of read-only variable 'x'
//x = 2;
//但可以通过指针间接赋值,只会给出警告:
//[Warning] initialization discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
int *p = &x;
*p = 2;
printf("%d", x);
}
全局变量与局部变量
#include <stdio.h>
int x = 1;
int fun_1() {
int x = 2;
printf("%d\n", x);//2
}
int fun_2(int x) {
printf("%d\n", x);//3
}
int fun_3() {
printf("%d\n", x);//1
}
int main() {
int x = 3;
fun_1();
fun_2(x);
fun_3();
{
int x = 4;
printf("%d\n", x);//4
}
printf("%d", x);//3
return 0;
}
注意
- C语言没有字符串类型,使用字符数组表示字符串
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
int main() {
char *str = (char*)malloc(MAX_SIZE * sizeof(char));
gets(str);
puts(str);
return 0;
}
- 数组不是基本数据类型,而是构造类型
- C语言中char的本质是一个整数,输出的是ASCII码对应的字符。可以直接给char赋一个整数,输出时会按照对应的ASCII字符输出。此外,char类型还可以进行运算。
#include <stdio.h>
int main() {
char c1 = 65;
int x1 = 65;
char c2 = 'A';
int x2 = 'A';
printf("c1:%c, x1:%d, c2:%c, x2:%d\n", c1, x1, c2, x2);
//printf:c1:A, x1:65, c2:A, x2:65
printf("c1+'2':%d, c1+'2':%c", c1+'2', c1+'2');
//printf:c1+'2':115, c1+'2':s
return 0;
}
函数与程序结构
外部函数
几个printf()的输出格式
#include <stdio.h>
int main() {
printf("%o\n", 8);//10,八进制无符号整数
printf("%x\n", 16);//10,十进制无符号整数
char *str = "atreus";
printf("%s\n", str);//atreus,输出字符串
printf("%c\n", str[0]);//a,输出单个字符
printf("%p\n", str);//0000000000404008,输出指针地址
return 0;
}