2308-初识C语言part1
初识C语言:
一个项目只有有一个main函数!,否则会报错
1.main函数。程序保存为.c
//int——返回类型(整型),main——函数名,{ }——函数体。 #include <stdio.h> int main() { //在屏幕打出hello world printf('hello world\n');//printf——库函数——屏幕打印信息,需要引用头文件stdio.h // \n表示换行 return 0; }
2.数据类型
char //字符数据类型,1 byte
short //短整型,2 byte
int //整形, 4 byte
long //长整型,4 byte
longlong //更长的整形,8 byte
float //单精度浮点数,4 byte
double //双精度浮点数,8 byte
1字节(byte) = 8比特(bit)
常量、变量(全局,局部)
%d 整型
%f float
%lf double
#define _CRT_SECURE_NO_WARNINGS 1//防止vs警告scanf #include <stdio.h> int age = 1;//此处age为全局变量 int main() { char ch = 'a';//char字符类型 int age = 20;//整形,此处age为局部变量。当局部和全局变量名字一样,局部优先 short num = 100;//短整型,long,longlong float weight = 66.6;//浮点型, double printf("%d\n", 100);//打印整数 printf("%d\n", sizeof(int));//sizeof - 关键字 - 操作符 - 计算类型或者变量所占空间的大小 //--------------------- int x = 0; int y = 0; int sum = 0; scanf("%d %d", &x, &y);//需要输入x的数值,enter后输入y的值,最后会自动给出sum sum = x + y;//求和 printf("sum = %d\n", sum); return 0; }
要注意scanf是需要输入的,否则就是个白框!
3.变量的作用域和生命周期
局部变量:作用域为变量所在的局部范围,生命周期(变量的创建和销毁之间的时间段)同
全局变量的作用域:整个工程(项目),生命周期为整个程序
对于同一工程(项目),两个不同.c源文件,在一个文件中定义某变量int g_val后,在另一文件使用extern int g_val即可调用
执行性代码如printf必须放在 { } 里,如main函数
#include <stdio.h> int b = 2021;//全局变量 int main() { printf("1:%d\n",b);//第1次打印b,成功 { printf("2:%d\n", b);//第2次打印b,成功 int a = 10;//{ }内为局部变量a的作用域,故在{ }外a无法打印 printf("a = %d\n", a); } printf("3:%d\n", b);//第3次打印b,成功 return 0; }
4.常量
1 #include <stdio.h> 2 enum Sex//变量Sex的所有可能取值,其子集为常量 3 { 4 Male,//若此处改为Male=10,则后面打印Male为10,Female为11 5 Female//常量 6 }; 7 int main() 8 { 9 //---1.字面常量--- 10 3.14; 11 10; 12 "a"; 13 "abcdef"; 14 15 //---2.const修饰的常变量--- 16 int num = 10;//前面加const 会使得num为常量导致不能改动,下一行报错 17 num = 20; 18 printf("num = %d\n", num);//输出num = 20 19 20 int arr[10] = {0};//10个元素 21 //这里[ ]内必须为常量,如10,不能为const常变量,或者变量 22 23 //---3.#define 定义的标识符常量--- 24 #define MAX 10000//#define 定义的标识符常量MAX=10000 25 //若再写MAX = 20000;会报错,已给MAX常量赋值,不能重新赋值 26 int n = MAX; 27 printf("n = %d\n", n); 28 29 //---4.枚举常量(可以一一列举的常量)--- 30 //在第二行定义了枚举常量 31 printf("%d\n", Male);//第一个值默认输出为0 32 printf("%d\n", Female);//第二个值默认输出为1 33 return 0; 34 }
5.字符串+转义字符+注释
5.1 字符串
使用:调试——窗口——监视。
字符为单引号'a',字符串为双引号"abc"。
由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个0 的转义字符。在计算字符串长度的时候 0 是结束标志,不算作字符串内容。
1 #include <stdio.h> 2 #include <string.h>//含strlen函数 3 int main() 4 { 5 "hello";//" "字符串 6 char arr[] = "hello";//字符串在结尾隐藏了\0的字符,是结尾标志,在监视里能看到 7 char arr1[] = "abc";//打印出abc 8 char arr2[] = { 'a','b','c' };//结尾无\0会导致打印abc后面乱码,可以再加一个元素'\0'避免 9 printf("%s\n", arr1); 10 printf("%s\n", arr2); 11 //求字符串长度 strlen() 12 int len = strlen("abc");//string length 13 printf("len = %d\n", len);//输出为3,因为长度不包含\0 14 printf("len1 = %d\n", strlen(arr1));//输出为3 15 printf("len2 = %d\n", strlen(arr2));//输出为随机值,arr2再加一个元素'\0'可避免 16 return 0; 17 }
5.2 转义字符&注释
转义字符:转变原来的意思
1 #include <stdio.h> 2 int main() 3 { 4 printf("%s\n", "\"");//打印",\表示将后面一个符号作为元素看待 5 printf("c:\\test\\test.c\n"); 6 //此处\t为转义字符,前面加一个\来变为元素,输出结果为c:\test\test.c 7 printf("%c\n", '\130');//8进制的130等于10进制88,输出字符按照ASCii为X 8 printf("%c\n", '\x30');//16进制,为48,输出为字符‘0’ 9 //int a = 1; //C++注释风格 10 /* 11 int b =2; 12 */ //C语言注释风格,不支持嵌套注释 13 return 0; 14 }
例题:printf("%d\n", strlen("c:\test\328\test.c")); 输出为什么?
答:14,\t算一个字符,\32算一个。
6. 选择、循环、函数、数组
6.1 if选择+while循环
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include <stdio.h> 3 int main() 4 { 5 //---if选择--- 6 int input = 0; 7 printf("join us, will you learn(1/0)?\n"); 8 scanf("%d", &input); 9 if (input == 1)//括号内为if条件 10 printf("good\n"); 11 else 12 printf("bad\n"); 13 //---while循环--- 14 int line = 0; 15 while (line < 3000) 16 { 17 printf("写代码:%d\n", line); 18 line++; 19 } 20 if (line == 3000) 21 { 22 printf("good\n"); 23 } 24 return 0; 25 }
6.2 函数
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include <stdio.h> 3 int Add(int x, int y)//设计函数Add(x,y)=x+y 4 { 5 int z = 0; 6 z = x + y; 7 return z; 8 } 9 10 int main() 11 { 12 int num1 = 0; 13 int num2 = 0; 14 scanf("%d%d", &num1, &num2); 15 //int sum = num1 + num2;//使用非函数方法解决 16 int sum = Add(num1, num2);//函数方式解决 17 printf("%d\n", sum); 18 return 0; 19 }
6.3 数组
数组 :一组相同类型的元素的集合
数组用下标(序号,从0开始)来访问
1 int main() 2 { 3 int i = 0; 4 int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 5 char ch[5] = { 'a', 'b', 'c' }; 6 while (i < 10) 7 { 8 printf("%d ", arr[i]); 9 i++; 10 } 11 return 0; 12 }
7.操作符
- 算数操作符:+ - * / %
- 移位操作符:>> <<
(例:int a = 2; int b = a << 1; 左移操作符移动的是二进制位,a是整型4byte=32bit,即 a = 00...010,10前面30个零,
左移后变为 a = 00...0100,100前面29个零,即 a = 100,十进制为4,故b=4 )
- 位操作符:& 按位与, | 按位或, ^ 按位异或
- 赋值操作符:= += -= *= /= &= ^= |= >>= <<=
(例:a = a + 2 等效为 a += 2 )
单目操作符:只有一个操作数的操作符(如+是双目操作符,有a+b两个操作数)
! :printf("%d\n", !a); 0表示假,非零为真;若a为假,!a则为1(真),反之为0(假)
补充:一个整数的二进制表示有3种: 原码 反码 补码
原码
原码就是用第一位表示符号,其余位表示值,比如如果是32位二进制:
[+3]原码 = 0000 0000 0000 0000 0000 0000 0000 0011
[-3]原码 = 1000 0000 0000 0000 0000 0000 0000 0011
因为第一位是符号位,所以32位二进制整数的取值范围就是:
[1111 1111 1111 1111 1111 1111 1111 1111 , 0111 1111 1111 1111 1111 1111 1111 1111] ==> [-2147483647, 2147483647]
反码
反码的表示方法是:
*正数的反码是其本身
*负数的反码是在其原码的基础上,符号位不变,其余各个位取反
-3 原码 1000 0000 0000 0000 0000 0000 0000 0011
反码 1111 1111 1111 1111 1111 1111 1111 1100
+3 原码 0000 0000 0000 0000 0000 0000 0000 0011
反码 0000 0000 0000 0000 0000 0000 0000 0011
补码
补码的表示方法是:
*正数的补码就是其本身
*负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(即在反码的基础上+1)
-3 原码 1000 0000 0000 0000 0000 0000 0000 0011
反码 1111 1111 1111 1111 1111 1111 1111 1100
补码 1111 1111 1111 1111 1111 1111 1111 1101
+3 原码 0000 0000 0000 0000 0000 0000 0000 0011
反码 0000 0000 0000 0000 0000 0000 0000 0011
补码 0000 0000 0000 0000 0000 0000 0000 0011
~ :按位取反,把所有二进制位中0和1互换(包括符号位),如a = 2,码有32位
- 原码:00...010,
- ~操作后作所有元素零一互换:111...101
- 作为补码,然后补码——反码——原码输出:111..101——111...100——100...011即为-3
- 故 printf("%d\n",~a);输出为-3
++:前置++是先++,如++a。后置++是先使用再++,如a++
( ): 强制转换,例如(int)为强制转换为int
地址符 & 和 * 暂时不讲
- 关系操作符:>= <= == != > <
- 逻辑操作符:&& 逻辑与 || 逻辑或
- 条件操作符:三目操作符,如exp1 ?exp2 : exp3 表示:若exp1成立,得到exp2的结果,反之得到exp3结果
- 逗号表达式:逗号分隔表达式,从左向右依次计算,整个表达式的结果是最后一个表达式的结果
- 下标引用、函数调用和结构成员:
[ ] 下标引用,例如 arr[5] 表示引用数组arr的第六个元素;
( ) 调用函数的时候,函数名后边的 ( ) 就是函数调用操作符,例如 printf("%d\n", a)有两个操作数,printf("aa")有一个操作数,还可以没有
. 和 -> 暂时不讲
1 #define _CRT_SECURE_NO_WARNINGS 1 2 #include <stdio.h> 3 int main() 4 { 5 float a = 10.0 / 3;//小数点要用float,要打小数点 6 printf("%f\n", a); 7 int b = 9 % 2;//余数,得1 8 //---sizeof--- 9 int c = 2; 10 printf("%d\n", sizeof(int)); 11 printf("%d\n", sizeof(c));//两者都打印的是整型变量大小 12 int arr[10] = { 0 }; 13 printf("%d\n", sizeof(arr));//数组大小为4,内含10个元素,故大小为40 14 printf("%d\n", sizeof(arr[0]));//每个元素大小为4 15 printf("%d\n", sizeof(arr) / sizeof(arr[0]));//40 ÷ 4 = 10 16 //---~--- 17 printf("~c = %d\n", ~c);//按位取反,结果为-3 18 //--- ++ --- 19 int d1 = 10; 20 int e1 = ++d1;//前置++,先++后使用 21 int d2 = 10; 22 int e2 = d2++;//后置++,先使用后++ 23 printf("d1 = %d\n", d1);//11 24 printf("e1 = %d\n", e1);//11 25 printf("d2 = %d\n", d2);//11 26 printf("e2 = %d\n", e2);//10 27 //---()--- 28 int a1 = (int)3.14;//(int)为强制转换为int 29 printf("a1 = %d\n", a1); 30 //--- && ||--- 31 int b1 = 0; 32 int b2 = 3; 33 int b3 = b1 && b2; 34 int b4 = b1 || b2; 35 printf("b3 = %d\n", b3);//0 36 printf("b4 = %d\n", b4);//1 37 //---?:--- 38 int max = b1 > b2 ? b1 : b2;//比大小 39 printf("max = %d\n", max);// 40 //--- , --- 41 int x1 = 0; 42 int x2 = 3; 43 int x3 = 5; 44 int x4 = (x1 = x2 + 2, x3 = x1 - 4, x2 = x3 + 2);//逗号是从左到右依次计算,取最右端结果 45 printf("x4 = %d\n", x4);//x4 = 3 46 return 0; 47 }
8.常见关键字
c语言提供的,不能自己创建关键字,变量名不能是关键字
auto: 局部变量前都有auto,但可省略,有其他用法暂时跳过
break:循环,switch等用到
register:寄存器关键字。
计算机的数据可以在:寄存器,高速缓存,内存,硬盘,网盘。速度从左到右依次变慢,空间相反。
define&include不是关键字,是预处理指令
typedef:类型重定义
1 #include <stdio.h> 2 typedef unsigned int u_int;//重命名unsigned int为u_int 3 void test() 4 int main() 5 { 6 unsigned int num1 = 100;//两者一样 7 u_int num2 = 100; 8 return 0; 9 }
static:静态,可修饰局部变量,全局变量,函数。
--------------------------------------------------------------
static修饰全局变量,使得只能在自己所在的源文件 (.c) 内部可以使用其他源文件不能使用!
全局变量,在其他源文件内部可以被使用,是因为全局变量具有外部链接属性但是被static修饰之后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了
--------------------------------------------------------------
static修饰函数,使得函数只能在自己所在的源文件内部使用,不能在其他源文件内部使用
本质上: static是将函数的外部链接属性变成了内部链接属性!(和static修饰全局变量一样!
--------------------------------------------------------------
define定义宏:
1 #include <stdio.h> 2 #define MAX 100//定义常量 3 #define ADD(X,Y) X+Y//定义宏,正确写法为((X)+(Y)) 4 int main() 5 { 6 printf("%d\n", MAX); 7 printf("ADD = %d\n", 4 * ADD(2, 3));//4*2+3=11 8 return 0; 9 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库