2020——C的学习笔记(gcc 9.2.0 32位)

这篇博客详细介绍了C语言的基础知识,包括程序结构、数据类型、运算符、预处理指令等内容。讨论了主函数、变量声明与定义、指针、数组、结构体等概念,还涉及了预处理指令如#include、宏定义#define,以及各种运算符的使用。此外,提到了gcc/gdb编译调试在32位环境下的应用。
摘要由CSDN通过智能技术生成

程序

1. 程序是对数据的运算。
2. 仅数据的类型决定其在内存中的布局与大小。

程序结构

主函数

1. 形式为 int main(){语句块}
2. 程序仅仅执行主函数,从语句块第一条语句开始,执行完所有语句或遇到 return 关键字结束。但可以在主函数中对其它函数进行嵌套调用,如 printf() 函数。

预处理指令

   预处理指令在正式编译前,由预处理程序执行完成。

#include

   文件包含命令,用法为 #include <c文件路径>#include "c文件路径"。使用<> 时,编译器会在系统路径中寻找文件;使用" " 时,则会优先在编译器安装目录下的 include 文件夹下寻找,找不到的话再去系统路径中找。
   包含标准头文件时用<>,包含自定义头文件时用" ",会是一个好习惯。
   在控制台编译时,可以使用 gcc 命令的 -I 选项增加搜寻路径,那么编译器会优先在所增加的路径中寻找。

gcc -I 路径 

#define、#undef

   宏定义命令,用法为#define 宏名 字符序列 ,其中字符序列可以为数字、表达式、if 语句、函数等。它让我们可以给一个需要频繁使用到的表达式起一个名字,从而简化代码。
   在预处理过程中,代码中的所有宏会被简单替换成宏定义时的字符序列,称为 宏展开 ,除非超出了宏的作用域。
   #undef表示宏的作用域到此为止。

#if、 #ifdef、 #ifndef、 #elif、 #else、 #endif

   条件编译命令,其中#ifdef 宏名 表示如果定义了宏则执行语句下面的程序段,#ifndef 宏名 反之。其余略。

#line

   用法为#line 整数行 文件名 ,其中 行数文件名 顺序不能对调,且文件名要加" "。本质上是对__LINE____FILE__重新赋值。

int main(){
   
	#line 9 "a.c"
	printf("%d\t%s", __LINE__, __FILE__);
}
9       a.c

#error、#warning

   手动抛出错误或警告。

数据类型

变量的声明与定义

   格式:type variable_name1 = value, variable_name2 = value;

	extern int a;
	int b=1, c;
左值与右值

   lvalue:指向内存位置的表达式,可以在赋值运算符左边或者右边。
   rvalue:存储在内存中的值,只能在赋值运算符右边,被赋给左值。

	int b=1;
	2 = b;

提示错误:

error:lvalue requires as left operand of assignment
整数类型

1. char 和 int、unsigned int 。
2. 其中 char 可细分为signed char与unsigned char。
3. int 可细分为 short(2字节) 与 long(4字节) ,而 unsigned int 与 int 不是包含关系,而是并列, int 等同于 signed int 。
4. unsigned int 可细分为 unsigned short 与 unsigned long 。
5. 其中unsigned顾名思义,无符号的。整数的符号,首先想到的也就只有负号了。unsigned作为修饰其含义为 非负的

	unsigned char a = -1;
	unsigned short b = -1;
	unsigned long c = -1;
	printf("%d\n%u\n%lu\n",a,b,c);
255
65535
4294967295

   注意:输出时,printf() 函数的格式化说明符需与变量类型保持对应,否则会发生类型转换。
   另外,%lu处若为%d%u均会提出警告,表示arguments of type 'long unsigned int'不应对应 format '%d'format '%u'
   且%u处为%d时却不会提出警告,明明 argument b 也不是 format '%d'expecttype 'int'。猜测是因为 (signed) int 的取值范围必能包含(signed) short 的取值范围,故无需警告。

6. char、int、short、long的取值范围均包含正与负,赋正值或赋负值都可。

    char a = -1;
	int b = -1;
	short c = -1;
	long d = -1;
	printf("%d\n%d\n%d\n%d",a,b,c,d);
 -1
 -1
 -1
 -1

7. 各整数类型的取值范围首先取决于其长度,再根据是否 unsigned 修饰进行进一步运算即可。

	char a;
	printf("char型占用内存:%d byte,故unsigned char型取值范围为:0~%d\n",sizeof(a),(int)(pow(2,(int)(8*sizeof(a))))-1);
	
	short b;
	printf("short型占用内存:%d byte,故unsigned short型取值范围为:0~%d\n",sizeof(b),(int)(pow(2,(int)(8*sizeof(b))))-1);
	
	long c;
	printf("long型占用内存:%d byte,故unsigned long型取值范围为:0~%d\n",sizeof(c),(int)(pow(2,(int)(8*sizeof(c))))-1);
char型占用内存:1 byte,故unsigned char型取值范围为:0~255
short型占用内存:2 byte,故unsigned short型取值范围为:0~65535
long型占用内存:4 byte,故unsigned long型取值范围为:0~2147483646

   int型取值范围为short与long的合集。

浮点数类型
	float a;
	double b;
	long double c;
	printf("float型占用内存:%d byte\ndouble型占用内存:%d byte\nlong double型占用内存:%d byte\n",sizeof(a),sizeof(b),sizeof(c));
	printf("float型取值范围为:%e~%e\ndouble型取值范围为:%e~%e\nlong double型取值范围为:%e~%e\n",FLT_MIN,FLT_MAX,DBL_MIN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值