【问题标题】:Difference between signed main() and int main()?有符号的main()和int main()之间的区别?
【发布时间】:2019-12-19 14:23:11
【问题描述】:
#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 must return int”,但是当我用signed main()替换时,没有错误。是什么原因?

【问题讨论】:

  • signedunsigned 如果不指定任何其他类型,则默认为 signed intunsigned int
  • #define int long long 医生,我开枪打中了自己的脚。你能告诉我为什么会痛吗?

标签: c++ int main signed


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    #define int long long
    

    你到底为什么要那样做????

    typedef pair<int,int>pint;
    

    不要那样做。输入pair&lt;int, int&gt;;不要偷懒。此外,您使代码复杂化只是为了定义 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&lt;int&gt; 而不是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++;
        }
    }
    

    另外,ABsize() 成员:

    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),则不必在for 中搜索3。另外,最好有:

    static const auto n= 3;
    vector<int> A(n);
    vector<int> B(n);
    

    假设它们总是相同的大小。

    空格,请看:

    cout << pa << " " << pb << endl;
    

    【讨论】:

    • 好像你没有得到这个问题。我问为什么签名的 main() 完成了这项工作,但使用 int main() 却显示错误。哦,请正确阅读。
    • 更不用说#include&lt;bits/stdc++.h&gt; using namespace std;的所有问题了..
    • @shubh “好像你没有得到问题。我问为什么签名的 main() 完成了工作,但使用 int main() 它显示错误” - 那将是 #define int long long 位.
    • @user11920318 是的,我读过。我明白了。但不评论其余部分就像进入一所着火的房子并指着你在清洁地毯时错过的污渍。那个代码是一团糟。在这么多级别中是禁止的。此外,我认为你“打破 C”的部分很清楚。
    • 谈话真的很晚,但我想我可能会插话。这种缩写代码在竞争性编程中很常见,我们希望尽可能快地输入内容。泛型可能需要很长时间才能输入,所以我们可以保存任何内容,看看我的模板:pastebin.com/zQSJMxvG // 别担心,我不会在工作中使用任何这些 ;)
    【解决方案3】:

    一般来说,您不希望 #define 将在您的代码中使用的东西,因为它可能会导致无法预料的问题,从而导致错误。我经常遇到的是:

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

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

    【讨论】:

    • 特别是,您不想使用#define 重新定义任何 C++ 关键字。这是不允许的。 +1。
    • 对于一个名为max 的函数,如果你不顾一切,可以使用一个技巧:将max 放在括号中作为普通名称使用。 (max) 不会触发类函数宏,因为max 后面没有(
    猜你喜欢
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 2020-03-01
    • 2013-11-04
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多