C语言笔记_第四章

一、C语言bool类型
可以使用逻辑运算的true、false

#include <stdio.h>
#include <stdbool.h>
int main(){
	bool a=10>5;
	bool b=true;
	printf("a的值为%d b的值为%d",a,b);
	\\b和a的值仍然是整数 只能输出1或者0
return 0;
}

二、逻辑运算
逻辑运算只能对逻辑量进行运算,运算结果只有0和1.

运算符描述实例运算结果
逻辑非!a与a相反
&&逻辑与a&&b见0出0,两1出1
II逻辑或aIIb见1出1,两0出0
一般情况下逻辑运算符优先级低于比较运算符,但是单目运算符优先级要高于双目运算符。
如果我们需要对数学表达式中的开区间和闭区间进行表述
eg:
判断
a∈[1,100]
G∈[A,Z]
#include <stdio.h>
int main(){
int a=30;
char b='G';
if(a>=1&&a<=100)
	printf("a属于1到100闭区间\n");
if(b>='A'&&b<='Z')
	printf("b内元素属于A到Z闭区间");
return 0;
}

结合各种运算的优先级

优先级运算符结合性
1()从左到右
2(单目)+ - ++ – !从右到左
3* / %从左到右
4+ -从左到右
5< <= > >=从左到右
6== !=从左到右
7&&从左到右
8II从左到右
9+= -= *= /= %=从右到左

注意逻辑运算的短路现象
<运算1>&&<运算2> 如果运算1判断为假则不会再进行运算2
<运算1>||<运算2>如果运算1判断为真则不会再进行运算2
三、条件运算符
<条件>?<条件满足时的操作>:<条件不满足时的操作>
优先级比赋值高比其他的都要低,自右向左结合。
eg:
我们输入两个数,输出最大的数。

#include <stdio.h>
int main(){
int a;
int b;
int max;
printf("请输入两个数:\n");
scanf("%d %d",&a,&b);
max=a>b?a:b;//注意优先级,由于优先级高于赋值所以:两侧条件不要出现赋值
printf("其中最大的数是:%d",max);
return 0;
}

四、逗号运算符
处于所有运算赋值的优先级最底层,自左向右计算。
<表达式1>,<表达式2>
作用:逗号用来连接两个表达式或赋值运算,其中会先计算表达式1再计算表达式2,
将表达式2的结果作为逗号运算的结果。
eg:

#include <stdio.h>
int main(){
int a;
int b;
a=5+3,4+7;
b=(5+3,4+7);
printf("其中a的值是%d\n",a);
printf("其中b的值是%d",b);
return 0;
}

五、级联与嵌套的if_else
对于多级联的if_else,else总是和最近的if进行匹配,若有大括号优先匹配括号内。
eg:我们需要比较三个数的大小从而输出最大的那个数。

#include <stdio.h>
int main(){
	int a;
	int b;
	int c;
	int max;
	printf("请输入三个数:\n");
	scanf("%d %d %d",&a,&b,&c);
	if(a>b){
    	if(a>c){
    	max=a;
    	}else{
    	max=c;
    	}
    }
    else{
    	if(b>c){
    	max=b;
    	}else{
    	max=c;
    	}    
    }
    printf("最大的数是:%d",max);
return 0;
}

eg:我们有一个分段函数
x=1,f(x)=5x+2;
x<1,f(x)=100;
x>0,f(x)=6x-5;

#include <stdio.h>
int main(){
int x;
int f;
printf("请输入x的值:\n");
scanf("%d",&x);
	if(x==1)
		f=5*x+2;
	else if(x<1)
		f=100;
	else if(x>0)
		f=6*x-5;
printf("函数f(x)的值是:%d",f);
return 0;
}

六、Switch_case语句
switch (<控制表达式>){
case <常量>:
<执行体>;
case <常量>:
<执行体>;

default:
<执行体>;
break;
}
注意:<控制表达式>只能是整数的结果
break:如果找到对应的case <常量>的值则程序会从匹配到的case
开始往下去执行,直到遇到break跳出switch_case 语句。
eg:
成绩转换程序
[90,100] 等级:A
[80,89] 等级:B
[70,79] 等级:C
[60,69] 等级:D
[0,59]等级:not pass

#include <stdio.h>
int main(){
	int grade;
	printf("请输入您的考试成绩:\n");
	scanf("%d",&grade);
	grade/=10;
	switch (grade){
	case 10:
	case 9:
		printf("您的等级为A");
		break;
	case 8:
		printf("您的等级为B");
		break;
	case 7:
		printf("您的等级为C");
		break;
	case 6:
		printf("您的等级为D");
		break;
	default:
		printf("not pass");
		break;
	}	
return 0;
}

七、随机变量
rand()函数可以产生一个随机数
eg:
我们如果要做一个猜数游戏

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
	srand(time(0));
	int random=rand();
	int digit;
	int count=1;
	digit=random;
	printf("正确答案是%d\n",random);
	while(digit>=10){
		digit/=10;
		count++;
	}
	printf("需要猜的数是%d位数\n",count);//提示信息 
	int guess;
	do{
		printf("请输入你猜的数:\n");
		scanf("%d",&guess);
		if(guess>random){
			printf("你猜大了.\n");
		}else if(guess<random){
			printf("你猜小了.\n");
		}
	}while(guess!=random);
	printf("恭喜你猜对了");
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: memset 函数可以用来将一块内存空间的值设置为指定的值,它常用于对数组、结构体等数据结构进行初始化操作。不过需要注意的是,对于结构体内部的指针变量,使用 memset 并不能直接将其初始化为 NULL,因为在内存中 NULL 的值并不是 0。 一个比较好的做法是,在结构体定义的时候将指针变量初始化为 NULL,例如: ``` struct Node { int data; struct Node *next; }; struct Node node = {0, NULL}; ``` 这样就可以确保在使用 memset 进行清零操作时,结构体内部的指针变量也被正确地初始化为 NULL。 如果要使用 memset 对结构体进行清零操作,可以使用以下代码: ``` struct Node node; memset(&node, 0, sizeof(struct Node)); ``` 这里我们使用 & 符号获取结构体变量的地址,然后将其作为 memset 函数的第一个参数传入。第二个参数是要设置的值,这里我们设置为 0 表示清零。第三个参数则是结构体的大小,可以使用 sizeof 运算符来获取。 需要注意的是,使用 memset 函数进行清零操作时,要确保结构体中的所有成员变量都可以被正确地清零,否则可能会导致程序出现未知的错误。另外,在使用 memset 函数时,也需要注意不要越界访问内存空间。 ### 回答2: memset函数是C语言中用于对指定的内存块进行初始化的函数,常见的使用方式是对数组和字符串进行初始化。然而,对于结构体内部包含指针的情况,memset函数并不能直接用于初始化指针所指向的内存空间。 原因在于,memset函数是以字节为单位进行操作的,而指针的大小往往是4个字节或8个字节,因此无法准确地将指针的值初始化为NULL或其他指定的值。 对于结构体内部的指针,我们可以通过手动逐个成员初始化的方式,来达到初始化的目的。例如,可以先将结构体的指针成员赋值为NULL,然后再逐个成员进行初始化。示例如下: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int *ptr; int num; } MyStruct; void initializeStruct(MyStruct *s) { s->ptr = NULL; s->num = 0; } int main() { MyStruct s; initializeStruct(&s); printf("ptr = %p\n", s.ptr); printf("num = %d\n", s.num); return 0; } ``` 在上述代码中,通过initializeStruct函数对结构体s进行初始化,将s.ptr赋值为NULL,将s.num赋值为0。这样就可以实现对结构体内部指针的初始化。 需要注意的是,对于结构体内部嵌套的其他结构体或者动态分配的内存空间,我们同样需要手动进行逐个成员初始化,以确保结构体内部的所有指针都被正确初始化,并且不产生内存泄漏的问题。 ### 回答3: memset是C语言中的一个函数,用于对一段内存空间进行初始化操作。它可以将指定内存区域的每个字节都设置为特定的值。 在C语言中,结构体是一种用户定义的数据类型,它可以包含多个不同类型的变量。结构体可以被看作是一种形式上的数据集合,可以统一管理一组相关的变量。 结构体内可以包含指针变量,这些指针变量可以指向堆内存中的某个地址。然而,当我们使用memset来初始化结构体内的指针时,需要注意指针变量指向的内存空间是否已经被分配。 由于memset函数只能设置内存空间的值,并不能为指针变量分配内存,因此在使用memset初始化结构体内指针之前,需要先为指针变量分配足够的内存空间。否则,如果指针未指向有效的内存地址,当我们尝试访问这个指针时,可能会导致程序崩溃或者产生未知的结果。 所以在使用memset来初始化结构体内指针时,我们需要先为这些指针变量分配内存,并在memset函数调用之后再对这些指针进行进一步的操作,以确保指针变量的正确性和有效性。 在使用结构体时,我们也可以将多个结构体通过指针链接成链表结构,形成一种更加复杂的数据结构。链表可以通过指针将各个结构体连接起来,方便进行数据的插入、删除和查找等操作。 此外,C语言还提供了枚举类型,它可以定义一些常量集合,方便程序员使用和维护。枚举类型可以用于表示一组相关的取值,通过定义的枚举常量,我们可以直观地理解程序中的某些状态或者选项。 总之,结构体、链表和枚举是C语言中重要的概念和特性,它们能够帮助我们更好地组织和管理程序中的数据,提高代码的可读性和可维护性。在使用这些特性时,我们需要注意指针的正确使用和内存的分配释放,以避免出现错误和内存泄漏等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值