signed main() 和 int main() 之间的区别?

问题描述 投票:0回答:4
#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()
时,就没有错误了。原因是什么?

c++ int program-entry-point signed
4个回答
6
投票

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

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


5
投票
#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;



2
投票

#define max(a,b)(a<b?a:b)

这可以防止任何人在该定义之后的任何代码中编写名为“max”的函数。


0
投票

#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;

	
© www.soinside.com 2019 - 2024. All rights reserved.