第一节初识C语言(一)

C语言的学习记录

第一个程序

第一个程序(1)

#include <stdio.h>
int main()
{
	printf("num=2");
	return 0;
}

第一个C语言程序由三部分组成:
1.int main()和return 0
2.int main()和return 0 两者之间的代码块
3.#include <stdio.h>,即需声明包含stdio.h文件。

第一个程序扩展(2)

#include <stdio.h>             // <stdio.h>  是指standard input  output 标准输入输出头文件

int main()
{
	//int 是整形的意思
	//int main()表示调用main()函数返回一个整型值
	printf("hello world\n");   
	printf("我是路飞\n");
	printf("海贼王\n");
	
	// 1.F10 可查看main()的每一步
	// 2.main()是程序的入口,不能没有main(),仅能有一个main()函数
	// 3.int main()表示调用main()函数返回一个整型值,与return 0首尾呼应 (void main()已过时)
	// 4.printf是print fuction(库函数),使用c的库函数需打招呼声明使用包含一个叫stdio.h的文件。 即#include <stdio.h>,
	// 5.只要使用库函数就要声明#include <stdio.h>  
	return 0;
}

数据类型

char 字符类型
short 短整型
int 整形
long 长整型
long long 长长整形
float 单精度浮点型
double 双精度浮点型

见下使用例程:

#include <stdio.h>  
int main()
{
	char ch = 'A';                 // 字符类型  字符名称=‘内存’
	printf("%c\n", ch);            //以字符类型打印ch

	int age = 20;                   // 向内存申请两个字节,用来存放20
	printf("%d\n", age);           //打印整型十进制数据 age

	short age1 = 6;
	printf("%d\n", age1);          //打印短整形数据age1

	long age2 = 100;
	printf("%d\n", age);

	float f = 2.3;
	printf("%f\n",f);

	double c = 2.34;
	printf("%lf",c);

	return 0;
}

疑问:
1.为什么出现这么多的类型?
2.这些类型的大小是多大? 1244848
答:用sizeof()函数查找,见下例程

#include <stdio.h>
int main()
{
	printf("%d\n", sizeof(char));     //1 byte字节    一个字节=8个比特位
	printf("%d\n", sizeof(short));    //2
	printf("%d\n", sizeof(int));      //4
	printf("%d\n", sizeof(long));     //4
	printf("%d\n", sizeof(long long));//8
	printf("%d\n", sizeof(float));    //4
	printf("%d\n", sizeof(double));   //8
}

常量与变量

局部变量和全局变量
见例程

# include <stdio.h>
int num1 = 20;               // 全局变量:定义在{}外部
int main()
{
	int num2 = 10;           // 局部变量:定义在{}内部                        
	return 0;
}

疑问:两者可以同名吗?可以,局部变量优先。
注意:局部变量只能在本身{}内使用,见下例v,会报错

//例v
# include <stdio.h>
int main()
{
	int age = 10;
	{
		printf("%d\n", age);  //定义的整形数据age与printf()不在同一作用域,故报错
	}
	return 0;
}

再见下例

#include <stdio.h>
int main()
{   
	//计算两数之和
	int num1 = 10;
	int num2 = 10; 
	int sum = 0;                    // c语言语法规定,变量需定义在当前代码最前面
	                                // 输入数据使用scanf_s()函数
	scanf_s("%d%d",&num1,&num2 );   //&:取地址符号
	sum = num1 + num2;
	printf("sum=%d\n", sum);
	return 0;
}

注意:
教程课上老师使用VS2013,输入函数为scanf()
本人使用VS2022,对应的输入函数为scanf_s(),这里的scanf_s()不是C语言标准提供的,而是由VS编译器提供的,无法在跨平台使用

变量的作用域和生命周期

作用域:作用域的可用性的范围就是变量的作用域 见例s

//例s
#include <stdio.h>
int main() 
{
	int num = 0;                       // 可以执行,变量和执行语句处于同一代码块 
	printf("num=%d\n", num);
	return 0;
}

#include <stdio.h>
int main()
{
	int num = 0;                       // 可以执行,变量作用域包含执行语句
	{
		printf("num=%d\n", num);
	}
	return 0;
}

#include <stdio.h>
int main()
{
	{
		int num = 0;                    // 不可执行,变量作用域不包含执行语句
	}
	printf("num=%d\n", num);
	return 0;
}

小结
1.局部变量的作用域是变量所在的局部范围
2.全局变量的作用域是整个工程,例如下例:

#include <stdio.h>
int main()
{
	extern int g_val;             // entern声明外部符号,在另一个源文件中的g_val;
	printf("g_val=%d\n", g_val);
	return 0;
}

生命周期
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束
全局变量的生命周期是:整个程序的生命周期

注意:上面提到的使用scanf()函数会出错,这里怎么解决呢?
答:在代码段的第一行加上:
# define _CRT_SECURE_NO_WARNINGS 1
见下例


#include <stdio.h>
int main()
{
	int num1 = 0;
	int num2 = 0;
	int sum = 0;
	scanf("%d%d", &num1, &num2);    //& :取地址
	sum = num1 + num2;
	printf("sum=%d",sum);
	return 0;
}
// 使用scanf()会报错,于是提示使用scanf_s(),但scanf_s()不具跨平台性,推荐使用scanf(),如何使用?
// 在第一行添加  # define _CRT_SECURE_NO_WARNINGS 1   即可
// 加载源文件的第一行

常量

分为以下四种:
字面常量
const修饰的常变量
#define定义的标识符常量
枚举常量
以下分别举例:
1.字面常量

#include <stdio.h>
int main()
{
	//5
    //3.14
	return 0;
}

2.const修饰的常变量

#include <stdio.h>
int main()
{
	int num = 4;             // 变量num=4,可变
	//const int num = 4;     //用const修饰的常变量num=4,不可变。const:具有常属性
	printf("%d\n", num);
	num = 8;                  //可变
	printf("%d\n", num);
	
	//int n = 10;            //n是变量
	//n = 20;                //可变

	//const int n = 10;      // n具有常属性,但本质是变量,称常变量
	//n = 20;                // 故这里报错

	//int arr[n] = { 0 };    // 这里报错是因为不能为n,需要为10
	
	return 0;
}

3.define定义的标识符常量

# include <stdio.h>
# define MAX 10
int main()
{
	int arry[MAX] = { 0 };
	printf("%d\n",MAX);
	return 0;
}

4.枚举常量

//性别:男,女
//三原色:红绿蓝

# include <stdio.h>
enum Sex
{
	MALE,FEMALE,SECRET    // 枚举常量
};

int main()
{
	enum Sex s = FEMALE;   // 用Sex创建的s变量被赋值   
	printf("%d\n", MALE);  //0  ,有值且不可被改变,故称枚举常量
	return 0;
}
//注意:s可以改,FEMALE不可以改

字符串+转义符+注释

1.字符串:由双引号”“引起的一串字符成为字符串
注意:字符串的结束标志是\0的转义字符。在计算字符串长度的时候\0是结束标志,不算字符串内容

#include <stdio.h>
int main()
{
	char arr[] = "abc";               // 用空数组来存”abc“
	                                  // "abc"='a''b''c' \0' (后面还有0), \0' 是字符串结束的标志

	//char arr1[] = { 'a','b','c' };   // 故本句需改为char arr1[] = { 'a','b','c' ,0};
	char arr1[] = { 'a','b','c' ,'\0'};
	printf("%s\n",arr);
	printf("%s\n", arr1);

	printf("%d\n", strlen(arr));     //打印长度
	printf("%d\n", strlen(arr1));
	
	return 0;
}

拓展:监视器的值分别对应为🅰️97 b:98 此为 ASCII编码

2.转义字符
\n 换行
\t 水平制表符
\? =?
\\ =\ 表示一个反斜杠
\“=” 一个字符串内部的双引号
\ddd ddd表示1-3个8进制数字 如:\130x
\xdd dd表示2个十六进制数字 \x30 0

# include <stdio.h>
int main()
{
	// printf("c:\user\sdas");        //句中\u 和\s带有转义含义,故这里报错
	printf("c:\\user\\sdas");      //应使用下面这种\\u,\\s ,斜杠使转义失效
	return 0;
}
# include <stdio.h>
# include <string.h>
int main()
{
	printf("%d\n",strlen("c:\test\32\test.c"));  //13    \32算一个字符
	//32是两个8进制数字
	//32作为8进制代表的十进制数字26,作为ASCII码值26对应的字符 ”右箭头“
	//32=10进制数26
	printf("%c\n",'\32');
	printf("%c\n", '\132');   //Z
	printf("%c\n", '\x61');   //a
	return 0;
}

3.注释
注意:注释不可嵌套
方式:// 和/* */
快捷键:ctrl +k+c

选择语句

#define _CRT_SECURE_NO_WARNINGS 1   
#include <stdio.h>
#include<string.h>

int main()
{
	int input = 0;
	printf("欢迎加入比特!");
	printf("你要好好学习吗?请输入1 or 0选择>:");   //>:  输入
	scanf("%d",&input);   // &input取地址操作,注意:不能掉
	if (input == 1)
		printf("你会拿到好offer!");
	else
		printf("卖红薯");
	return 0;
}

循环语句

while语句
for 循环
do while

#define _CRT_SECURE_NO_WARNINGS 1   
#include <stdio.h>
#include<string.h>

int main()
{
	int line = 0;
	printf("今天加入比特");
	while (line<10000)
	{
		printf("每天敲一行代码,第%d行\n",line);
		line++;
	}
	printf("你已经出师了!");
	return 0;
}

函数

#include <stdio.h>
Add(int x, int y)      //函数名(参数)   Add为自定义函数
{
	int z = x + y;     // 函数体
	return z;
}
int main()
{
	int num1 = 0;
	int num2 = 0;
	int sum = 0;
	sum = Add(2, 3);      //  调用函数
	printf("sum=%d", sum);
	return 0;
}

数组

C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。
在这里插入图片描述

#include <stdio.h>

int main()
{
	int arr[7] = {1,2,3,4,5,6,7};  //定义一个存放10个整型数字的数组
	int i = 0;
	while (i<=6)
	{
		printf("%d\n", arr[i]);
		i++;
	}
	return 0;
}

操作符

算术操作符
在这里插入图片描述
移位操作符(二进制移位)
在这里插入图片描述

位操作符 (二进制)
在这里插入图片描述
&(按位与) |(按位或) ^(按位亦或)
赋值运算符
在这里插入图片描述

单目操作符/双目/三目 (目:几个操作对象)
![在这里插入图片描述](https://img-blog.csdnimg.cn/03faf711e3754f638553c9fd527a60cc.png
关系操作符:
在这里插入图片描述
逻辑操作符
在这里插入图片描述
条件操作符
在这里插入图片描述
下标引用操作,函数调用和结构成员
在这里插入图片描述
下面看例程:
移位`

#include <stdio.h>
int main()
{
	int a = 1;
	int b = 0;
	a = a << 1;    // 对二进制移位
	b=a << 2;
	printf("%d\n", a);   //2
	printf("%d\n", b);   //8

	return 0;
}

取较大值

# include <stdio.h>
#include<string.h>
int main()
{
	int num1 = 10;
	int num2 = 20;
	if (num1 > num2)
		printf("%d",num1);
	else
		printf("%d",num2);
	return 0;
}

关于sizeof

#include <stdio.h>
int main()
{
	int a = 10;
	int arr[] = {1,2,3,4,5,6};        // 一个字符4个字节
	printf("%d\n",sizeof (a));        // 4
	printf("%d\n", sizeof(int));      //4
	printf("%d\n", sizeof a );        //4
	// printf("%d\n", sizeof int );   //24
	printf("%d\n", sizeof(arr));      //6
	printf("%d\n", sizeof(arr)/ sizeof(arr[0]));

	return 0;
}

~ 按位取反

#include <stdio.h>
int main()
{
	int a = 0;    //一个字符4个字节,一个字节8bit位,共32bit位  即000000000000000000000000000000000
	int b = ~a;         // 1111111111111111111111111111111111   反码
	
	printf("%d\n", b);   // -1
	//负数在内存中存储的时候,存储的是二进制的补码
	//这里为什么是-1?
	// 因为上述中的b 的首位是1,符号位表示为负数,
	//说明该数是补码,而打印出的是源码,即1-该数=0..01 又等于反码 取反加1 =0..01   即-1
	// 补码=源码取反加1  源码=补码取反加1(减1取反)
	
	return 0;
}

a++

#include <stdio.h>
int main()
{
	int a = 10;
	int b = a++;  //后置++ 先赋值,后自加
	int c = ++a;  // 前置++ 先自加,后赋值使用
	printf("a=%d,b=%d\n",a,b);    //11  10
	printf("a=%d,c=%d", a, c);  //11  11
	return 0;
}

常见关键字

在这里插入图片描述
register 寄存器变量

#include <stdio.h>
int main()
{
	register int a = 10;//建议把a定义成寄存器变量。因为寄存器的读写速度快

	//int a=10  等于signed int a=10(有符号数)
	//unsigned int a-10(无符号数)

	//union 联合体
	return 0;
}

typedef类型定义

// typedef unsigned int u_int;
//unsigned int num=20; 
//u_intnum2 = 20;    类型为int

static

  1. 修饰局部变量
    局部变量的生命周期变长
  2. 修饰全局变量
    改变了变量的作用域:静态全局变量只能在所在.c文件中使用(extern)
  3. 修饰函数
    修饰函数时改变了函数的链接属性,此时外部链接属性(外部可调用)变成了内部链接属性(外部不可调用)
    注意:extern ADD(int x,int y)
#include <stdio.h>
void test()
{
	//int a = 0;        //             打印结果:11111   int a为局部变量,在函数外被自动销毁
	static int a = 1; //a是一个静态局部变量   打印结果:23456   static int a静态局部变量,不会销毁
	a++;
	printf("%d \n", a); 
}
int main()
{
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		test();
	}
	return 0;
}

#define 定义常量和宏

//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
	int sum = ADD(2, 3);
	printf("sum = %d\n", sum);

	sum = 10 * ADD(2, 3);
	printf("sum = %d\n", sum);

	return 0;
}

指针

#include <stdio.h>
int main()
{
	int a=10;      // *p :解应用操作符(即本例中的指针类型,若a='w',则指针类型为char*)
	int* p = &a;    //指针类型定义的变量指向a
	                  //把a的地址取出来,给p,此时p是一串地址(0x002F3443),
	*p = 20;       //再把对应此地址的值变为20(10变成20)
	               //故输出内容a=20
	printf("a=%d\n",a);
	//printf("%p\n",&a);  // & 取地址


	double d = 3.14;   // 字节大小:32位上是4,64位上是8
	double* pd = &d; 
	*pd = 5.5;
	printf("%f\n", d);
	printf("%f\n", *pd);

	return;
}

指针变量的大小
//结论:指针大小在32位平台是4个字节,64位平台是8个字节。

结构体

含义:定义复杂对象的一种描述方法,结构体,自己定义的

# include<stdio.h>
# include<string.h>
struct Book
{
	char name[20];
	short price;  
};
int main()
{   
	struct Book b1 = {"数据结构",55};  // 结构体定义的变量
	struct Book* pb = &b1;     //结构体指针类型 定义的变量pb指向b1

	printf("书名:%s\n",b1.name);
	printf("价格:%d\n", b1.price);
	b1.price = 15;
	printf("修改后的价格:%d\n",b1.price);

	printf("%s\n", (*pb).name);  // 利用指针变量打印书名和价格
	printf("%d\n", (*pb).price);

	printf("%s\n", pb->name);    // 利用结构体指针
	printf("%d\n", pb->price);

    // 修改书名 ,由于这里name[]是一个数组,故不像修改price那样直接修改
	strcpy(b1.name,"C++");
	printf("%s\n",b1.name);
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值