#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> pint;
typedef vector<int> vint;
typedef vector<pint> vpint;
#define rep(i,n) for(int i = 0; i < (n); i++)
int main()
{
vint A(3), B(3);
rep(i, 3) cin>> A[i];
rep(i, 3) cin >> B[i];
int pa = 0, pb = 0;
rep(i, 3) {
if(A[i] > B[i]) pa++;
else if(A[i] < B[i]) pb++;
}
cout << pa << " " << pb << endl;
return 0;
}
使用
int main()
时,编译器显示错误消息“main必须返回int”,但是当我将其替换为signed main()
时,就没有错误了。原因是什么?
int main
不返回 int
- 它返回 long long
。您已经定义了一个名为 int
的宏。
说到这里,使用与关键字匹配的名称定义宏会表现出未定义的行为。
#define int long long
你到底为什么要这么做???
typedef pair<int,int>pint;
不要这样做。输入
pair<int, int>
;不要偷懒。另外,您使代码变得复杂只是为了定义 pint
(任何理性的人都会假设“指向 int 的指针”)只是为了不使用它。
typedef vector<int>vint;
typedef vector<pint>vpint;
同上。不要这样做。
#define rep(i,n) for(int i=0;i<(n);i++)
不。不,请不要这样做。
int main()
您将
int
定义为其他东西。此时你已经打破了 C。
vint A(3),B(3);
请花点时间输入
vector<int>
而不是 vint
,并且请在自己的行上初始化每个变量。
rep(i,3)cin>>A[i];
这对你来说似乎很清楚吗?我什至不知道我是否想知道它的作用。不要使用宏。请。
int pa=0,pb=0;
另外,除了将每个初始化放在自己的行上,并回想一下您将
int
定义为 long long
之外,请保持一致:A
是一个变量,您用大写字母命名它,但在这里您是不使用大写字母。尝试选择您想要的任何规则,但要“一致”。就像,“所有类都以大写字母开头,所有变量都以小写字母开头”。
请正确缩进。并且放一些空格,他们不会按字符向你收费。如果可以的话,请始终戴上牙套。而不是这个:
rep(i,3) {
if(A[i]>B[i])pa++;
else if(A[i]<B[i])pb++;
}
就放这个:
for (int i= 0; i < 3; ++i) {
if (A[i] > B[i]) {
pa++;
} else if (A[i] < B[i]) {
pb++;
}
}
此外,由于
A
和
B
有 size()
成员:for (size_t i= 0; i < min(A.size(), B.size()); ++i) {
if (A[i] > B[i]) {
pa++;
} else if (A[i] < B[i]) {
pb++;
}
}
这样,如果将
A(3)
和
B(3)
更改为A(5)
和B(5)
,就不必在3
中搜索for
。另外,最好有:static const auto n= 3;
vector<int> A(n);
vector<int> B(n);
假设它们始终大小相同。
请留个空格:
cout << pa << " " << pb << endl;
#define max(a,b)(a<b?a:b)
这可以防止任何人在该定义之后的任何代码中编写名为“max”的函数。
#define int long long
这意味着编译器将所有 int 读取为 long long,并且 main 函数不能返回 long long 值,它必须是 int 值。原因是当你正确时:
int main()
读作:
long long main()
这是无效的。
这就是为什么使用该定义的人通常使用:
signed main()
相反。很多人使用的解决这个问题的另一种可能的解决方案是,不要将 long long 定义为 int ,而是将其定义为“ll”,如下所示:
#define ll long long
或
typedef long long ll;