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

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

cin,cout 的箭头等等。

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

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

共 135 条回复

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小时……

以上全部为本人亲身实验

pikahuan 逗比

但如果是longlong,cin和cout比scanf、printf快

Duke

数组开里面容易炸掉

root 站长

数据过大(超过10万以上的数据规模)需要用 scanf / printfcin 和 cout 会超时!

root 站长

等号和判等傻傻的分不清?一般来说, if 里面才有 == 判等,其他一般都是赋值 =

Duke

其实像int using namespace.....这种很好判断,以为如果对了就可以加粗的

root 站长

循环内部有两条语句以上的,不写{} 包括起来!

root 站长

数据过大需要用 scanf/printf,cin 和 cout 超时严重!