期末到了,肝货来了:C语言一些常见小问题

1.标识符:由字母和下划线和数字组成(不包括空格)组成,只能由字母和下划线开头 。例如: (4zy),(4wj),(4zwj),(4zy 4wj) 都是错误的 。                                                                   

2.字符串常量所占的内存字节长度为字符中字节个数加1,因为字符串是以\0结尾,这是字符串结束的标志。                                                                                                                                

3.运算符的优先级:!> 算术运算符>关系运算符>&&>||>赋值运算符。同时记住:取余运算符只能用于两整数运算。                                                                                                                     

4.&&与||运算符易错警示:表达式1&&表达式2,只有表达式1的值不为0,才会进行表达式2的运算。    表达式1||表达式2,只有表达式1的值为0,才会进行表达式2的运算,也就是说表达式1的值为1时,不进行表达式2的运算。例如:int a=4,b=5,c=3,d=6,m=1,n=1;  (m=a>b)&&(n=c>d);    输出m和n,结果是m=0,n=1                                                                                                   

5.逗号运算符和表达式是我们特别要注意的。表达式1,表达式2  先求表达式1,再求表达式2,但整个逗号表达式的值是表达式2的值。例如:int a=2;  int c=(a*2,a+10),a*5;       输出a和c的值,a等于2,c等于10                                                                                                                       

6.强制类型转换格式:(类型)(表达式),只是创造一个中间类型转换,得到中间变量,强制转换后各自类型都不变。                                                                                                        

7.三种基本程序语句:顺序结构、选择结构、循环结构。还有一些学校喜欢考这个,给大家混个眼熟。                                                                                                                                           

8.选择语句,无非就是一些if 与else 的问题,比较简单,这里不进行赘述。还有一个switch语句,初学者容易把switch()括号里放入非整数,这是错误的,括号里面只能放整型变量,还有break一定记得加。给个例子,问题:输入年月,求该年月有多少天:                                                                                                                                                                    

#include<stdio.h>

int main()
{
	int years,months,days,temp;
	printf("请输入年月日:");
	scanf("%d %d",&years,&months);
	
	if(years%400==0) 
	{
		temp=1;
	}
	if(years%4==0&&years%100!=0)   //能被400整除或者能被4整除而且不能被100整除的是闰年 29天 
	{
		temp=1;
	}
	
	else temp=0;
	
	switch(months)
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:days=31;break;
		case 2:
			{
				if(temp=1) days=29;
				else days=28;
			}
			break;
		case 4:days=30;break;
		case 6:
		case 9:
		case 11:days=30;break;
		default:printf("month input error \n");
	}
	printf("%d年%d月有%d天",years,months,days);
	return 0;
}

9.循环语句分为四个语句,while与do while与 for,知道do while 与while 区别是前面的必须要执行一次就行 。for循环则应用比较广泛,就讲一点吧,那个括号里的第三个表达式,可以放到for循环语句内部,可以自己定义条件。曾经博主就遇到这样一道题。

熟悉一下break和continue吧,记住break是跳出循环,提前结束整个循环语句,而且break只能在循环语句和switch语句中使用。而continue是结束本次循环,而且不执行下面未执行的语句而是接着进行下一次循环。                                                     

10.函数来讲讲递归调用吧,递归嘛就是“有递有归”,就是有去有回的意思,数学模型是数学归纳法,找出问题相同的解法,不断直接或间接调用自己函数体本身,最后找到结束条件,在该条件下能够直接返回值的表达式                                                                                                                                                             

11. 函数问题我们还需要注意的就是传参问题,理解实参和形参,传数组和指针怎么去传,讲讲传数组和指针吧,下面给两个比较简单的例子吧。问题一,输入五个数,并进行排序。问题二,输入两个数并交换。

#include<iostream>
using namespace std;
#define N 5

void sort(int arry[],int n)  //这里用选择排序吧,接地气
{
	int temp;
	for(int i=0;i<n;i++)
	{
		temp=i;
		for(int j=i+1;j<n;j++)
		{
			if(arry[i]>arry[j])
			{
				temp=j;
			}
		}
		if(temp!=i)
		{
			int t=arry[temp];
			arry[temp]=arry[i];
			arry[i]=t;
		}
	}
}

int main()
{
	int arry[N];
	for(int i=0;i<N;i++)
	{
		scanf("%d",&arry[i]);
	}
	sort(arry,N);
	for(int i=0;i<N;i++)
	{
		cout<<arry[i]<<" ";
	}
} 
#include<stdio.h>

int swap(int* x,int* y)
{
	int temp=*x;
	*x=*y;
	*y=temp;
	return (*x,*y);
}

int main()
{
	int a,b;
	scanf("%d %d",&a,&b);
	swap(&a,&b);
	printf("%d %d",a,b); 
    return 0;
}

12.对了,还有带参的宏定义。直接拿例子讲讲吧。针对此问题把式子列出来就行了,如下为sum=m+n+m+n*y,🆗,搞定。

#include<iostream>
using namespace std;
#define M(x) x+x

int main()
{
	int m=1,n=2,y=4;
	int sum=M(m+n)*y;
	cout<<sum;
	return 0;
}

13.到数组了,记得数组名是数组首地址, 再注意输入数据就行了。                   

    int a[10];
	scanf("%d",a);
	scanf("%d",&a[0]);      //这两种方法等效 
	for(int i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
	 } 

14.字符串赋值,大家想想,为什么[]里的数字不同呢?大家可以在评论区讨论。          

    char ch[3]={'d','c','b'};
	char cj[4]={"dcb"};
	char ck[4]="dcb"; 

                                                                              

15.字符串输入,输出函数的使用,为什么要用这个呢?因为scanf遇到空格就会结束,所以可以使用他们来解决这个问题。   

    char ch[3];
	gets(ch);
	puts(ch);
    char cg[3]="ab";
    puts(cg);

                                                                                                                                       

16. 指针的话记得&与*的使用,来讲讲指针与数组   

    int arry[3]={2,3,4};
	int *p=arry;
	for(int i=0;i<3;i++)
    {
        printf("%d\n",arry[i]);
		printf("%d\n",*(p+i));  //等价
    }

                                                                                                                                    

17.讲下*p++与*(p++)是等价的,因为++与*的优先级相同,结合方向为自右向左。作用是:先得到p指向的变量的值,再使指针变量p的值加1。                                                                    

18.指针与二维数组:

    int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
	int (*p)[3]=a;
	int *q=a;
	//这两个应该怎么找a[1][[2]
	a[1][2]=*(*(p+1)+2);  //因为指针变量p是指向具有3个int型元素的一维数组
	a[1][2]=*(*(q+1*4)+2);  //对比一下就很好理解啦
	//公式: 
    a[i][j]=*(*(p+i)+j);
	a[i][j]=*(*(q+i*4)+j); 

19.讲下字符指针和字符数组区别:前者可改变指向不同的字符串,后者是用来保存数据的。

20.字符数组和整型数组的赋值不能这样做:

    char ch[5];
	ch="abcde";
	int a[5];
	a[5]={1,2,3,4,5};

最后讲讲制转化吧

首先总结出两种规律:

1.十进制数->二进制,八进制,十六进制,相同的做法就是除二,除八,除十六,取余,但,是从最后一个读取到第一个

2.二进制,八进制,十六进制->十进制,相同的做法就是从最后一个数开始乘以二,八,十六的0次方到第一个数乘以二的n次方 ,再全部加起来,即得到十进制数

编程中我们常常使用这样的思想将十进制作为一个中间转化点,可以有效避免许多不必要的麻烦,掌握其上应该对进制转换是没有问题的了

但我们还是要了解一下二,八,十六进制之间的转换

3.二进制->八进制,十六进制,都是从右到左取数,但原本的顺序不变,一个是取三位,一个是取四位,不足的话补0,一样从取出来的位数开始,按照从最后一个数开始乘以二的0次方到第一个数乘以二的n次方,但最后不是加起来,而是直接连起来!

 

 

4.八进制,十六进制->二进制,对八进制和十六进制每一位进行,除二取余,同样对比上述每一位数都对应其分别有三个,四个二进制,不足时在最左边补0

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Libert_AC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值