c++犯错集(liuseroj全体同学的心血)

root 站长 2019-04-13 12:02:37 2024-03-31 18:51:56 161

cin,cout 的箭头等等。

这个帖子不准水楼,务必要求真实。。。

{{ vote && vote.total.up }}

共 122 条回复

chen_zhe 沙雕

最重要的错误:

真·板 子 写 挂

chen_zhe 沙雕

逆元忘了判断模数是否为素数

数学期望勇敢地开了int数组

组合数没写逆元然后炸了

在用费马小定理和欧拉定理时忘了判断是不是素数(这方面我已经死了四五次了

Duke

开小数组 数据分治写挂 不开long long(int*int=int) 后缀数组不写倍增 忘记把暴力部分换掉 不删调试信息 不写pushdown&pushup 行末不输出回车 记忆化搜索不标记已搜过状态 算错复杂度 数组开大MLE(N<<20) 枚举子集写错[j=i&(j-1)] 清数组不彻底 忘记求逆元的复杂度 n和m搞反

wuhaoyang

字符串用单引号

root 站长

但是很多事情就是不科学,嘻嘻~

root 站长

要相信科学!c++也是一样。

chen_zhe 沙雕

对对对,129就是一个栗子。在我的电脑上,getchar比cin慢n倍,cin比scanf慢10倍,scanf比fread慢5倍,fread比解绑cin慢8倍(妥妥的不科学)

cqbzybc20220707

@chen_zhe 有一些题专门卡cin和cout

chen_zhe 沙雕

@root scanf/printf其实不比cin/cout快多少

chen_zhe 沙雕

memset初始化数组注意的地方:

如果是memset(a, 负数, sizeof(a));

那么a数组将全部初始化为你指定的负数。

可如果是memset(a, 正数, sizeof(a));

就不行了……

我做了一个实验:

#include <cstdio>
#include <cstring>
int a[10];
int main()
{
	memset(a, 1, sizeof(a));
	printf("%d", a[1]);
}

输出结果很恶心。

但是,memset是内存复制,于是我尝试使用了以十六进制输出a[1](十六进制格式符是%x或%X)

#include <cstdio>
#include <cstring>
int a[10];
int main()
{
	memset(a, 1, sizeof(a));
	printf("%x", a[1]);
}

输出结果: 1010101

似乎很有什么规律

把1改成2呢?

#include <cstdio>
#include <cstring>
int a[10];
int main()
{
	memset(a, 2, sizeof(a));
	printf("%x", a[1]);
}

输出结果:2020202

改成3呢?3030303

改成4?4040404

于是我尝试了将1、2、3、4改为127

输出不是1270127

而是7f7f7f7f

8位了!

127的十六进制表示就是7f

改成10?

a0a0a0a

10的十六进制表示就是a

改成-1?

fffffff

一脸懵逼 1/10000

输出一下-1的十六进制?

fffffff

-2的十六进制表示?

ffffffe

哇偶,奇怪

之前看过紫书上说,-n是使用补码表示法表示的,即使用 表示。这下也就解答了为什么int有32位,但是正数却只能表示到2 ^ 31 - 1

但是memset如果把数组初始化为-2,就像这样:

#include <cstdio>
#include <cstring>
int a[10];
int main()
{
	memset(a, -2, sizeof(a));
	printf("%x", a[1]);
}

输出是fefefefe,不是fffffffe

这说明,memset的初始化的确是内存复制——是按照二进制来的。至于为什么十六进制能观察出结果,是因为2 ^ 4 = 16

有一天我就为memset废了3小时……

以上全部为本人亲身实验