学习笔记

++问题:

比如++i,返回的是i+1的值。而i++则是先返回i的值给调用者,然后i在自加1。 具体一点的话,如i初始值为1,j=++i后,i先+1并返回结果2给j。而j=i++后,i等于1先赋给j,i再自增1

char*&问题:

//void* my_memcpy(void* dest, const void* src, size_t num)
//{
//	void* ret = dest;
//	while (num--)
//	{
//		*(char*)dest = *(char*)src;
//		++(char*)dest;
//		++(char*)src;
//	}
//	return ret;
//}
////struct s
////{
////	int age;
////	char name[50];
////};
//
//int main()
//{
//	//struct s student[] = { {15,"王五"},{16,"李六"}};
//	//struct s copy[3] = { 0 };
//	char arr1[] = "abcdef";
//	char arr2[20] = { 0 };
//	char* arr=(char*)my_memcpy(arr2,arr1,sizeof(arr1));
//	printf("%s", arr);
//	return 0;
//}

const问题:

const char* pa不能改变的时指向内容 char* const pa不能改变的是指针

左定值,右定向

字节和字长问题:

一个字母就是一个字节,一个汉字两个字节=一个字,在同一时间中处理二进制数的位数叫字长,现在的cpu大部分是32位的,那么同一时间处理的字长为32位的二进制数据

枚举警告:

enum alphabet
{
	A,//枚举常量
	B,
	C,
	D
};
int main()
{
	enum alphabet word1 = A;
	return 0;
}

严重性 代码 说明 项目 文件 行 禁止显示状态 警告 C26812 枚举类型“alphabet”未设定范围。相比于 "enum",首选 "enum class" (Enum.3)。

野指针赋值问题

如下图,指针未初始化时为野指针,所以不能进行随便解引用赋值操作

int main()
{
	int* p;
	*p = 10;
}

1的存储问题

alt

extern用法

extern是用于声明一个外部变量/函数。即当一个变量/函数需要使用,但是在别的.c/.h文件中定义时,我们需要引用extern来对这个变量/函数进行声明

extern void Function(int a, intb)

extern variable;

宏的问题

#define Mul(x)  x*x
int main()
{
	Mul(5 + 1);
	return 0;
}

上面的代码输出的结果不是36,而是11,因为宏是完全替代进去,不会运算,即会变成5+1 * 1 +5=11

同理下面的结果是12

#define Add(x) x+x
int main()
{
	int ret = 5 * Add(2);
	return 0;
}

带有副作用的宏参数

#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
	int a = 10;
	int b = 11;
	int ret = MAX(a++, b++);
	printf("%d %d %d", a, b, ret);//11  13 12

	return 0;
}

MAX(x,y) ((a++)>(b++)?(a++):(b++))//b加了两次

int(x)问题

(int)x是强制类型转换

int(x)应该算是取整数的意思

二维数组与一维数组问题

C语言里,所有下标的表示法(如p[3]),最后都会转换成这种 * (p+3) 理解了这一点,那么,二维形式的 p [i][j] 会被转换成 * ( * (p + i) + j),即:p[3][2]会被转化成 * (* (p +3) + 2)

表达字符串的数组声明问题

数组的声明有:

	char arr[] = {"a"};
	char arr[] = "a";
	char arr[2] = "a";

字符串子串计算方法

s=n(n+1)/2+1;n是字符串里面的字符数

创建任意大小二维数组

malloc方法:

int main()
{
	int n = 0;
	int m = 0;
	int** p = 0;
	scanf("%d,%d", &n, & m);
	p = (int**)malloc(sizeof(int*)*n);//行
	for (int i = 0; i < n; i++)
	{
		p[i] = (int*)malloc(sizeof(int*) * m);
	}
	if (p == NULL)
	{
		return 0;
	}
	return 0;
}

new创建一维数组的方法:

	int* a = 0;
	int x, y;
	scanf("%d,%d", &x, &y);
	a = new int[x * y];
	
	for(int i = 0; i < x; i++)
	{
		for(int j = 0; j < y; j++)
		{
			*(a + i * y + j) =i;
		    printf("%d ",*(a + i * y + j));

		}
		printf("\n");
	}

new创建二维数组的方法:

#pragma warning(disable:4996)
#include<stdio.h>
#include<malloc.h>
#include<string.h>
int main()
{
	int** a = 0;
	int n = 0; 
	int m = 0;
	int i = 0;
	int j = 0;
	scanf("%d,%d", &n,&m);
	a = new int* [n];
	for (int i = 0; i < n; i++)
	{
		a[i] = new int[m];
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			a[i][j] = i + j;
			printf("%d ", a[i][j]);
			
		}
		printf("\n");
	}
	for (i = 0; i < n; ++i)
		delete[] a[i];
	delete[]a;
	return 0;
}

关于printf函数里的“#”问题

printf("%#o",1234);--#可以控制输出八进制数的前导0,同理也可用%#x输出十六进制数字前导0x,要想输出0X则用%#X

scanf函数里的%d %c %s问题

首先,scanf是从缓冲区stdin中读取信息并且清除,

%d和%s作用相似,空白字符都可以起到分离两个变量("%d %d")的作用,而%c不同,任何空白字符不能有分离%c变量的作用,包括空白字符也会被读取。

scanf清除缓存

1.getchar();

2.fflush(stdin);

3.scanf(" %c",&a);百分号前加空格,这与%c的工作原理有关,不加空格,%c会读取输入缓冲区的第一个字符,加了后,它会读取空格后的第一个字符。所以对于scanf()而言,%c是个较为特殊的说明符。 %c前没空格,scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()则读取标准输入流中第一个非空白字符,舍弃了空白字符

辗转相除法

#include<stdio.h>

int main()
{
    long long int a = 0, b = 0, tmp = 0, num = 0, mul = 0;
    scanf("%lld %lld", &a, &b);
    if (a > b)//确保a<b
    {
        tmp = a;
        a = b;
        b = tmp;
    }
    tmp = a*b;
    //最大公约数num
    while (a && b)
    {
        if (a > b)
           a = a % b;
        else
           b = b % a;
    }
    num = a > b ? a : b;
    //最小公倍数
    mul = tmp /num;
    printf("%lld", mul + num);
    return 0;
}

pow sqrt

pow函数用于求平方、sqrt函数用于求开方

while(~scanf("%d", &a))

scanf没有输入时返回-1,按位取反就是0,等价于scanf("%d",&a)!=EOF

只读取部分数字/字符的情况

int main()
{
	int a = 0,b=0;
	char c[3] = { 0 };
	scanf("%2s%4d%2d",c, &a, &b);//只读取2个字符,4个数字,2个数字
	printf("%s %d %d",c, a, b);
}

输入/输出函数中%后的数字问题

scanf("%d %3f", &weight, &high);--只录三位,只录小数位后2位不能写成%.2f,应该写成前面形式%.nf,也可改写成a-(int)a。这种表示只读取小数位,后面在限定输出位数即可

scanf类型问题

scanf括号里面的类型不能改变/错,如不能写成scanf("%d",&a);如果char a =0;

ceil和floor

ceil有向上取整的意思,floor有向下取整的意思

	float a = 1.6, b = 1.2, c = 0, d = 0;
	c = ceil(1.6);//2.0
	d = floor(1.6);//1.0
	printf("%.1f %.1f",c,d);

质数问题(不懂原理)

判断质数时,利用试除法时每次可增加2个单位,并且做多可以到n/i


{
    //或者i<sqrt(n)
    for(int i=2;i<=n/i;i++)
        if(n%i==0)
            return false;
    return true;
}

fmod函数

这个库函数用于取余数,即 double fmod(double x, double y),返回x/y的值

abs函数、fabs函数

abs返回整型参数的绝对值 fabs返回浮点型参数的绝对值

#include<math.h>
int main()
{
	int a = -55;
	int b = 0;
	b=abs(a);
	printf("%d\n", b);
	return 0;
}

循环中反复正负问题

int main()
{
	int a = 15;
	for (int i = 0; i < 16; i++)
	{
		a = -a;
		printf("%d\n", a);
	}
	return 0;
}
//-15
//15
//-15
//15
//....

数组存放字符串问题

如需要存放字符串"1234",则需要开辟一个大小为arr[5]的数组,因为需要存放'\0'

回文数一种巧妙的写法(转载)

#include<stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    int i = 0;
    for(i = 1; i <= n; i++)
    {
        int t = 0, num = i;
        while(num > 0)
        {
            t = t*10 + num % 10;
            num = num / 10;
        }
        if(t == i)
            printf("%d\n", i);
    }
    return 0;
}

scanf输入和printf输出问题

在scanf未输入完之前,printf不会输出

字符串大小写输出

strlwr(arr)小写 strupr(arr)大写

Python重写new问题


    instance = None

    def __new__(cls, *args, **kwargs):

        if cls.instance is None:

            cls.instance = super().__new__(cls)
            return cls.instance

        else:

            return cls.instance

全部评论

相关推荐

uu们,拒offer时hr很生气怎么办我哭死
爱睡觉的冰箱哥:人家回收你的offer,或者oc后没给你发offer的时候可不会愧疚你,所以你拒了也没必要愧疚他。
点赞 评论 收藏
分享
嵐jlu:我是山川🐔里🐔🧱的,阿里系简历全过; 你这简历一看就还是半成品啊,没有荣誉经历奖项什么的吗?
投递阿里巴巴集团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务