有符号 main() 和 int main() 之间的区别?

1 c++ int signed program-entry-point

#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;
}
Run Code Online (Sandbox Code Playgroud)

使用时int main(),编译器显示错误消息“main must return int”,但当我用 替换时signed main(),没有错误。什么原因?

Igo*_*nik 5

int main不返回int- 它返回long long. 您已经定义了一个名为 的宏int

说到这里,定义一个名称与关键字匹配的宏会表现出未定义的行为。


Mir*_*rko 5

#define int long long
Run Code Online (Sandbox Code Playgroud)

你到底为什么要这么做???

typedef pair<int,int>pint;
Run Code Online (Sandbox Code Playgroud)

不要那样做。类型pair<int, int>; 不要偷懒。另外,您使代码变得复杂只是为了定义pint(任何理性的人都会假设“指向 int 的指针”)只是为了不使用它。

typedef vector<int>vint;
typedef vector<pint>vpint;
Run Code Online (Sandbox Code Playgroud)

同上。不要那样做。

#define rep(i,n) for(int i=0;i<(n);i++)
Run Code Online (Sandbox Code Playgroud)

不,不,请不要这样做。

int main()
Run Code Online (Sandbox Code Playgroud)

你定义int为别的东西。此时你已经破坏了C。

vint A(3),B(3);
Run Code Online (Sandbox Code Playgroud)

请花点时间键入vector<int>而不是vint,并且请在自己的行上初始化每个变量。

rep(i,3)cin>>A[i];
Run Code Online (Sandbox Code Playgroud)

这对你来说似乎很清楚吗?我什至不知道我是否想知道它的作用。不要使用宏。请。

int pa=0,pb=0;
Run Code Online (Sandbox Code Playgroud)

另外,除了将每个初始化放在自己的行上并回想一下您定义int为 之外long long,请保持一致:A是一个变量并且您用大写字母命名它,但在这里您没有使用大写字母。尝试选择您想要的任何规则,但要保持一致。就像,“所有类都以大写字母开头,所有变量都以小写字母开头”。

请正确缩进。并且放一些空格,他们不会按字符向你收费。如果可以的话,请始终戴上牙套。而不是这个:

rep(i,3) {
    if(A[i]>B[i])pa++;
    else if(A[i]<B[i])pb++;
}
Run Code Online (Sandbox Code Playgroud)

只要这样:

for (int i= 0; i < 3; ++i) {
    if (A[i] > B[i]) {
        pa++;
    } else if (A[i] < B[i]) {
        pb++;
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,asABhassize()成员:

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++;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,如果您将A(3)和更改B(3)A(5)B(5),则无需3在 中搜索for。另外,最好有:

static const auto n= 3;
vector<int> A(n);
vector<int> B(n);
Run Code Online (Sandbox Code Playgroud)

假设它们总是大小相同。

空格,请:

cout << pa << " " << pb << endl;
Run Code Online (Sandbox Code Playgroud)

  • 谈话确实很晚了,但我想我可以插话一下。这种缩写代码在竞争性编程中很常见,我们希望尽可能快地输入内容。泛型可能需要花费大量时间来输入,因此我们尽可能保存所有内容,看看我的模板:pastebin.com/zQSJMxvG // 别担心,我在工作中不会使用任何内容;) (5认同)