C语言学习

C语言学习

  • 初始c语言
      • enum枚举:
      • strlen 计算长度:
      • 特殊编码
      • 按位与,或,异或
    • static
      • 1.局部变量:
      • 2.全局变量:
    • extern
      • #define 的使用
        • 常数定义:
          • 宏命令定义
    • 指针
    • 指针简单使用
    • 结构体 struct
    • 循环、选择、判断语句
    • break和continue
    • 小节练习

初始c语言

enum枚举:

  	enum MyEnum
	{
		q, w
	};

strlen 计算长度:

  strlen(arr1)

特殊编码

/*
\0表示结束
? 在书写连续问号时,防止被解析成三字母词( ??) = ] )
\’ 用于表示字符常量’
" 用于表示字符常量"
\ 用于表示一个反斜杠
\a 警告字符,蜂鸣
\b 退格符
\f 进纸符
\n 换行符
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd ddd表示3个八进制数字(0~7)
\xdd dd表示2个十六进制数字
*/

#include 

int main01() {
	//enum MyEnum
	//{
	//	q, w
	//};
	//printf("q=%d\n", w);
	// strlen 计算长度
	char arr1[] = "abc";


	char arr2[] = { 'a', 'b', 'c', '\0'};
	 int arr[] = {9};
	 printf("%d\n", strlen(arr1));
	 printf("%d\n", strlen(arr2));
	 printf("%d\n", strlen("c:code\test\32\text.c"));
	 printf("%s\n", arr1);
	 printf("%s\n", arr2);
	//int age, a, b, sum;
	//age = 2;
	//printf("%d\n", age);

	//scanf_s("%d%d", &a,&b);
	//sum = a + b;
	//printf("sum=%d\n", sum);
	return 0;

}

按位与,或,异或

/*
按位与& 对应位同为1,为1
按位或| 对应位为1,为1
按位异或^ 相同为0 不同为1
*/

#include 
int main02() {

	double a = 1.0;
	int arr[] = { 1,2,3,4,5,6 };
	printf("数组值=%d\n", arr[5]);

	printf("年龄=%f\n", a);
	int age = 0;
	 scanf_s("%d", &age);
	if (age > 18)
	{
		printf("成年人,年龄=%d\n", age);
	}
	else {
		printf("未成年人,年龄=%d\n", age);
	}
	return 0;
}

~ 按位取反

// 00000000 00000000 00000000 00000101 a=5
// 11111111 11111111 11111111 11111010 b
// 11111111 11111111 11111111 11111001 反码
// 10000000 00000000 00000000 00000111 b=~a=-6

公式: -(a+1)

static

1.局部变量:

局部变量就是在函数内定义的变量,普通的局部变量,生存周期是随着函数的结束而结束,每次函数重新执行,局部变量都是新的值,不会保留上次的值。当用static修饰后,局部变量的生存周期就是当程序结束才会结束。再次调用函数时,用static修饰的变量会保留上一次的值。
应用:在函数内,我们想保留某些变量上一次的值,就可以用static去修饰该变量。比如:想统计该函数被执行的次数时,就可以定义被static修饰的int型变量,每执行一次该变量就++。
总结:用static修饰的局部变量,改变了生存周期,但是没有改变其作用域。改变其生存周期的原因是被static修饰的局部变量被存放在.bss段或者.data段,而普通的局部变量是存放在栈上的。

2.全局变量:

全局变量用static修饰改变了作用域,没有改变生存周期。普通的全局变量是可以被其他的.c文件引用的,一旦被static修饰,就只能被定义该全局变量的.c文件引用,使得该全局变量的作用范围减小。
作用:当一个全局变量不想被其他.c文件引用时,可以用static修饰,这样其他的文件就不能通过extern的方式去访问,这样主要是为了数据安全。
总结:改变其作用域,没有改变生存周期。

#include  
int main() {
    // int x = main2();
    // printf("x=%d\n", x);
    int i = 0;
    int x = 0;
    for (i = 0; i < 10; i++) {
        main3(x);
    }
    printf("\n", i);
    for (i = 0; i < 10; i++) {
        main4(x);
    }
    printf("z%d\n", i);
    return 0;
}

int main2(void)
{
    int x = 3;
    int a = 0;
    int b = ~a;
    int y = 4;
    x += y;
    // printf("%d\n",!a);
    // printf("%d\n",!x);
    // printf("%d\n", x);

    if (x <= 3) {
        printf("真");
    }
    else
    {
        printf("假\n");
    };
    printf("%d \n", b);
    a == 0 ? printf("zheng%d\n", a) : printf("jia%d\n", a);
    return 10;
}

int main3(x) {
    int i = 0;
    i++;
    printf("i=%d", i);
    //printf("x=%d\n", x);
    return 0;
}
int main4(x) {
    static i = 0;
    i++;
    printf("static i=%d", i);
    //printf("x=%d\n", x);
    return 0;
}

extern

在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。

// main.c
#include 
#include 

int main()
{
    extern xx;
    extern x;
    //printf("Hello world!%d\n", xx);
    printf("Hello world!%d\n", x);
    return 0;
}

// a.c
static int xx = 2022;
int x = 2023;

#define 的使用

常数定义:

#define XY 1000

宏命令定义

#define ADD(x,y)(x + y)

#include 
#include 
#define XY 1000
#define ADD(x,y)(x + y)
int main()
{
    int num = ADD(1,3);
    printf("xy=%d\n",  XY);
    printf("xy=%d\n",  num);
    return 0;
}

指针

#include 
int main()
{
    int a = 12;
    int* p = &a;
    *p = 15;
    printf("%d\n", a);
    printf("%p\n", &a);
    printf("%p\n", p);
	int x = 12;
	int* p = &x;
	int* c;
	int d = 0;
	c = p;
	printf("%p\n", p);
	printf("%d\n", *p);
	printf("%p\n", &x);
	printf("%p\n", c);

    return 0;
}

指针简单使用

int main09() {
	adda(10, 23, &d);
	printf("%d\n", d);
	return 0;
}

int adda(int x, int y, int* c) {
	(*c) = x + y;
}

结构体 struct

#include 
#include 
struct stad {
    char name[20];
    int age;
    double gongz;
};
int main()
{
    struct stad b = { "嘻嘻嘻", 12, 13.003 };
    // 修改结构体变量
    b.age = 12;
    strcpy(b.name, "小明");

    struct stad* p = &b;
    printf("%s\n", p->name);
    printf("p=%d\n", p->age);
    printf("p=%f\n", (*p).gongz);

    printf("%d\n", b.age);
    printf("%s\n", b.name);
    return 0;

}


循环、选择、判断语句

#include 
int main()
{
    int i;
    int age;
    for (i = 1; i <= 100; i++) {
        int s = jisu(i);
        if(s !=0 )
        printf("%d\n", s);
    };
    scanf_s("%d", &age);
    if (age >= 80) {
        printf("老年");
    }
    else if (age >= 18 && age < 80) {
        printf("青年");
    }
    else {
        printf("未成年");
    };

    return 0;

}
int jisu(i)
{
    if (i % 2 != 0)
        //printf("%d\n",i);
        return i;
    else
        return 0;
}

#include 
int main()
{
    int day;
    scanf("%d",&day);
    switch(day){
        case 1:
          printf("星期一\n");
          break;
        case 2:
          printf("星期2\n");
          break;
        case 3:
          printf("星期3\n");
          break;
        case 4:
          printf("星期4\n");
          break;
        case 5:
          printf("星期5\n");
          break;
        case 6:
          printf("星期6\n");
          break;
        default:
          printf("星期日\n");
    }
    /*
    while(day<10){
    printf("while%d\n",day);
    day++;
    };
    */
    do{
        printf("do%d\n",day);
        day++;
    } while(day<10);
    return 0;

}

break和continue

break终止循环,continue退出本次循环

小节练习

#include 
#include 
#include
int main07() {
	sxh();
	pinfang();
	cj();
	daox();
	nianyuer();
	return 0;
};

//水仙花
int sxh() {
	int a, b, c;
	for (int i = 100; i < 1000; i++) {
		int a = i % 10;
		int b = (i / 10) % 10;
		int c = i / 100;
		if (pow(a, 3) + pow(b, 3) + pow(c, 3) == i) {
			printf("%d\n", i);
		};
	};
}

// 完全平方
int pinfang() {
	for (int i = 10; i <= 200; i++)
	{
		if (i * i > 200)
		{
			break;
		};
		printf("%d\n", i * i);
	}
	return 0;
}

//判断成绩
int cj() {
	int x = 0;
	scanf_s("%d", &x);
	if (x >= 90 && x <= 100)
	{
		printf("优秀");
	}
	else if (x>=85 && x < 90) {
		printf("良好");
	}
	else if(x >= 60 && x < 85)
	{
		printf("及格");
	}
	else if (x >= 0 && x < 60)
	{
		printf("不及格");
	}
	else
	{
		printf("请输入正确成绩");
	}
	return 0;
}

//五位数倒序
int daox () {
	int x,a,b,c,d,e;
	scanf_s("%d", &x);
	if (x >= 10000 || x<=99999)
	{
		printf("请输入正确五位数!");
		return 0;
	}
	a = x % 10;
	b = (x / 10) % 10;
	c = (x / 100) % 10;
	d = (x / 1000) % 10;
	e = (x / 10000);
	printf("%d\n",a* 10000 + b*1000 + c*100 + d*10 + e);
	return 0;
}

// 判断天数
int nianyuer() {
	int x = 0;
	int y = 0;
	int z = 0;
	int t = 0;
	scanf_s("%d%d%d", &x,&y,&z);
	if ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0)
	{
		for (int i = 1; i <= y; i++)
		{
			t = t + month(i, 0);
		}
		printf("润年%d天", t + z);
	}
	else
	{
		for (int i = 1; i <= y; i++)
		{
			t = t + month(i, 1);
		}
		printf("no润年%d天", t + z);
	}
	return 0;
}
int month(int y, int types) {
	int t;
	if (y == 1 || y == 3 || y == 5 || y == 7 || y == 8 || y == 10 || y == 12)
	{
		t = 31;
	}
	else if (y == 4 || y == 6 || y == 9 || y == 11)
	{
		t = 30;
	}
	else
	{
		t = types == 0 ? 29 : 28;
	}
	return t;
}
// 加减乘除计算器
#include 
float add(float a, float b) {
	float sum = 0;
	sum = a + b;
	return sum;
}

float jian(float a, float b) {
	float sum = 0;
	sum = a - b;
	return sum;
}

float chen(float a, float b) {
	float sum = 0;
	sum = a * b;
	return sum;
}

int chu(int a, int b) {
	int sum = 0;
	sum = a / b;
	return sum;
}
int main08() {
	float a = 0;
	float b = 0;
	float jg = 0;
	char s[10];
	printf("a\n");
	scanf_s("%f", &a);

	printf("符号\n");
	scanf_s("%s", s, 10);

	printf("b\n");
	scanf_s("%f", &b);

	if ((*s) == (*"+"))
	{
		jg = add(a, b);
	}
	else if ((*s) == (*"-")) {
		jg = jian(a, b);
	}
	else if ((*s) == (*"*")) {
		jg = chen(a, b);
	}
	else if ((*s) == (*"/")) {
		jg = chu(a, b);
	}
	printf("%f", jg);
	return 0;
}

你可能感兴趣的:(c语言,c语言,学习,开发语言)