1.第一个C语言程序
#include<stdio.h>//printf函数的头文件
int main()
{
printf("Hello bit\n");
return 0;
}
//main函数是一个程序的入口,main有且仅有一个
2.数据类型:
#include<stdio.h>
int main()
{
printf("%d\n",sizeof(char));
printf("%d\n",sizeof(short));
printf("%d\n",sizeof(int));
printf("%d\n",sizeof(long));//C语言规定sizeof(long)>=4
printf("%d\n",sizeof(long long));
printf("%d\n",sizeof(float));
printf("%d\n",sizeof(double));
return 0;
}
3.变量, 常量
(1)数据类型的定义:
#include<stdio.h>
int main()
{
char a='w';
int age=120;
float wight=45.5f;
printf("%c\n",a);
printf("%d\n",age);
printf("%f",wight);
return 0;
//age这个变量的创建其实是需要在内存开辟空间的
//关键字sizeof:C语言中sizeof是用来计算变量或者使用类型创建的变量的大小,单位是字节,8bit=1Bity(1个字节=8个比特位)
//例如:sizeof(char) =1就表示char类型变量占1个字节,也就是8位,即0000 0000——————1111 1111
}
(2)变量的分类
局部变量
全局变量
#include<stdio.h>
int global=2019;//全局变量
int main()
{
int local=2018;//局部变量
int global=2020;//局部变量
printf("global=%d\n",global);
return 0;
}
//上面的局部变量global变量的定义其实没有什么问题
//当局部变量和全局变量同名的时侯,局部变量优先使用
(3)变量的使用
#define _CRT_SECURE_NO_WARNINGS 1#define _CRT_SECURE_NO_WARNINGS 1
//在VS中,如果没有这个东西,就会报错,提示用scanf_s的函数,该函数是VS编译器提供的,不是C语言自己的
//在其他的编译器下就没有scanf_s的函数,也不认识这个函数
//当你在代码中使用了scanf_s函数,你的代码在其他编译器下就无法正确的运行,这就降低了代码的跨平台性
#include<stdio.h>
int main()
{
int num1=0;
int num2=0;
int sum=0;
printf("请输入两个操作数:> ");
scanf("%d %d",&num1,&num2);
sum=num1+num2;
printf("sum=%d\n",sum);
return 0;
}
(4)变量的作用域和生命周期
作用域:定义的变量的有效区域
生命周期:定义的变量在代码运行时的有效时间段
(5)常量
#include<stdio.h>
int main()
{
//常量的定义方法:
//1.字面常量
100;
3.14;
"abc";
'w';
//2.const 修饰的常变量
const int num = 100;
printf("%d\n", num);
num = 200;//不能改变
printf("%d\n", num);
//在数组中,int arr[num]={0}不能定义,因为num虽然不能改变,但是其本质上仍然为变量
//3.#define定义的标识符常量 (习惯大写)
#define MAX 100
int b = MAX;
int arr[MAX];
printf("%d\n", b);
4.枚举常量
return 0;
}
4.字符串+转义字符+注释
(1)字符串
#include<stdio.h>
#include<string.h>
int main()
{
//字符串
char arr1[] = "bit";
char arr2[] = { 'b', 'i', 't' };
char arr3[] = { 'b', 'i', 't' ,'\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
printf("%d\n", strlen(arr1));//3
printf("%d\n", strlen(arr2));//输出随机值
printf("%d\n", strlen(arr3));//3
//strlen计算时,只计算字符串中‘\0’之前的字符数
return 0;
}
(2)转义字符
#include<stdio.h>
#include<string.h>
int main()
{
printf("c:\code\test.c\n");//并不能直接输出c:\code\test.c\n
printf("c:\\code\\test.c\\n\n");// 能直接输出c:\code\test.c\n
printf("\a");//蜂鸣
printf("%d\n", strlen("c:\test\328\test.c"));//14
// \32被解析成一个转移字符
return 0;
}
(3).注释
方法一:/*XXXXXXXXX*/
方法二://
多行注释:选中注释区域——> ctrl+k ——> ctrl+c
多行取消注释:选中注释区域——> ctrl+k ——> ctrl+u
5.选择语句
#include<stdio.h>
int main()
{
int input = 0;
printf("加入比特\n");
printf("你要好好学习吗?(1/0)");
scanf("%d", &input);
if (input == 1)
printf("好offer!\n");
else
printf("卖红薯!\n");
return 0;
}
6.循环语句
//while循环
#include<stdio.h>
int main()
{
int line = 0;
while (line < 20000)
{
printf("敲代码\n");
line = line + 1;
}
if (line >= 20000)
printf("好offer\n");
else
printf("火候还不够\n");
return 0;
}
7.函数
//用函数求两个数的和
#include<stdio.h>
int Add(int x, int y)
{
int z = x + y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
scanf("%d %d", &num1, &num2);
sum = Add(num1, num2);
printf("sum = %d\n", sum);
return 0;
}
8.数组
(1)整型数组
//整形数组
int main()
{
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//arr就是10个元素的整形数组,下标0——9;
int i = 0;
while (i <= 9)
{
printf("%d ", arr[i]);
i = i + 1;
}
return 0;
}
(2)字符数组
//字符数组
#include<stdio.h>
#include<string.h>
int main()
{
char ch1[5] = { 'a', 'b', 'c', 'd', 'e' };
char ch2[] = { 'a', 'b', 'c', 'd', 'e' };
char ch3[] = "hello";//后面默认有一个/0
printf("%d\n", sizeof(ch1));//5
printf("%d\n", sizeof(ch2));//5
printf("%d\n", sizeof(ch3));//6
printf("%d\n", strlen(ch1));//随机值
printf("%d\n", strlen(ch2));//随机值
printf("%d\n", strlen(ch3));//6
return 0;
}
9.运算符
(1)
//运算符
int main()
{
int n = 7 / 2;
printf("%d\n", n);
double ret = 7 / 2.0;
printf("%lf\n", ret);
int n = 7 % 2;
printf("%d\n", n);
}
(2)取模运算符
//取模运算符——只能作用于整型
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 2 == 0)
printf("偶数\n");
else
printf("奇数\n");
return 0;
}
(3)移位运算符
//移位运算符
int main()
{
int a = 3;
//0000 0000 0000 0000 0000 0000 0000 0011
int b = a << 1;//a 向左移一位
//0000 0000 0000 0000 0000 0000 0000 0110
printf("%d\n", b);
return 0;
}
(4)按位与或非
//按位与或非
int main()
{
int a = 3;
//0000 0000 0000 0000 0000 0000 0000 0011
int b = 5;
//0000 0000 0000 0000 0000 0000 0000 0101
int c = a & b;
//0000 0000 0000 0000 0000 0000 0000 0011
//0000 0000 0000 0000 0000 0000 0000 0101
//全1为1
//0000 0000 0000 0000 0000 0000 0000 0001 1
int d = a | b;
//0000 0000 0000 0000 0000 0000 0000 0011
//0000 0000 0000 0000 0000 0000 0000 0101
//有1为1
//0000 0000 0000 0000 0000 0000 0000 0111 7
int e = a^b;
//0000 0000 0000 0000 0000 0000 0000 0011
//0000 0000 0000 0000 0000 0000 0000 0101
//相同为0,不同为1
//0000 0000 0000 0000 0000 0000 0000 0110 6
printf("%d %d %d",c,d,e);
return 0;
}
(5).sizeof
//sizeof——计算变量或者类型创建变量占据的内存大小
int main()
{
int a = 10;
printf("%d\n", sizeof(a));//4
printf("%d\n", sizeof(int));//4
printf("%d\n", sizeof(10));//4
return 0;
}
(6).按位取反
// ~ 按位取反(2进制)
//按位取反是对存在内存中的补码进行取反的
int main()
{
int a=- 1;
//1000 0000 0000 0000 0000 0000 0000 0001 原码
//1111 1111 1111 1111 1111 1111 1111 1110 反码
//1111 1111 1111 1111 1111 1111 1111 1111 补码
//0000 0000 0000 0000 0000 0000 0000 0000 0(补码取反)
int b = ~a;
printf("%d\n", b);
return 0;
}
(6)a++, ++a
//a++
int main()
{
int a = 10;
int b = ++a;
//int b2 = a++;
printf("%d %d\n", a, b);// 11,11
return 0;
}
//++a
int main()
{
int a = 10;
int b = a++;
printf("%d %d\n", a, b);//10,11
return 0;
}
(7)强制类型转换——()
//强制类型转换——()
int main()
{
int n = (int)3.14;
printf("%d\n", n);
}
(8)与&& 或||
//与&& 或||
int main()
{
int a = 3;
int b = 5;
if (a == 3 && b == 3)
printf("haha\n");
else
printf("hehe\n");
//输出hehe
if (a == 3 || b == 3)
printf("haha\n");
else
printf("hehe\n");
//输出haha
}
(9)三目操作符
//三目操作符
int main()
{
int a = 10;
int b = 20;
int max = 0;
if (a > b)
max = a;
else
max = b;
printf("max=%d\n", max);
//简化后
max = (a > b ? a : b);
printf("max=%d\n", max);
}
(10)逗号表达式
//逗号表达式
//逗号表达式会从左往右依次计算
//逗号表达式的结果是最后一个表达式的结果
int main()
{
int a = 3;
int b = 5;
int c = 10;
int d = (a + 2, b = a - 3, c = b + 4);
// 5 b=0 c=4
//d=c=4
printf("%d\n", d);
return 0;
}
10.关键字
(1)关键字typedef
———类型重命名
(2)寄存器——register
例如:register int a=10;
register起建议作用,当有多个建议时,register判断谁更合适,选择性放入寄存器;
register int a=10不能取地址(&a),因为&取的是内存地址,不能取寄存器地址;
(3)关键字——static
static修饰局部变量——称为静态局部变量
static修饰全局变量——称为静态全局变量
static修饰函数——称为静态函数
静态局部变量:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void test1()
{
int i = 0;
i++;
printf("%d ", i);
}//i出了此函数就被销毁
void test2()
{
static int i = 0;//有static修饰
i++;
printf("%d ", i);
}//有static修饰,i出了此函数就不被销毁
int main()
{
int i = 0;
for (i = 0; i <= 10; i++)
{
test1();
}
printf("\n");
for (i = 0; i <= 10; i++)
{
test2();
}
return 0;
}
静态全局变量
静态函数
11.#define定义常量和宏
//#define定义常量和宏
#define MAX 100//定义常量
#define ADD(x,y) ((x)+(y))//定义宏,类似函数
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10 * ADD(2, 3);
printf("sum = %d\n", sum);
}
12.指针
(1)
int main()
{
int a = 10;
int *p = &a;
printf("%p\n", &a);//打印地址,%p是以地址的形式打印
printf("%d\n", *p);
return 0;
}
(2)
指针变量的大小:
指针变量的大小取决于地址的大小
32位平台下地址是32个bit位,即4个字节
64位平台下地址是64个bit位,即8个字节
14.结构体
//结构体
struct Stu
{
char name[20];
int age;
char sex[5];
};
int main()
{
struct Stu s = {"张三",20,"男"};
printf("name = %s age = %d sex = %s\n", s.name, s.age, s.sex);
struct Stu *ps = &s;
printf("name = %s age = %d sex = %s\n", ps->name, ps->age, ps->sex);
}