问题描述
#include <iostream>
using namespace std;
#define ll long long
int main() {
int a = 5;
ll maxi = 1;
maxi = max(maxi,maxi * ll(a));
cout<<maxi<<endl;
return 0;
}
为什么这段代码会抛出错误?我不明白 #define ll long long 有什么问题。
解决方法
请记住 #define
执行文本替换。你最终得到这个:
maxi = max(maxi,maxi * long long(a));
这是无效的,因为函数转换的类型名称,粗略地说,不能在顶层包含空格。因此,出于同样的原因,unsigned int(a)
、long double(a)
等都无效。
解决方案是使用 using
而不是 #define
:
using ll = long long;
或者做(ll)a
,因为在这种情况下允许空格。
但如果我是你,我会去掉 ll
并使用 (long long)a
,因为 ll
是一个相当不具描述性的名称。
请注意,#define ll long long
是对宏的滥用,并且出于多种原因是有害的:
-
令人困惑。从看到
ll maxi = 1;
开始,一个理性的人会期望ll
是一种类型,而ll(a)
会起作用。如果它不是宏,它会起作用。 -
短名称可能与事物冲突。如果您将此
#define
放在标题中,然后包含另一个出于任何目的使用单词ll
的标题,它会中断。为了避免这种情况,宏应该有很长的可怕的 ALL_CAPS 名称。
宏应该是最后一个核心选项,当其他一切都失败时使用,而不仅仅是当你不想输入一些额外的字母时使用。
这是您在竞争性编程网站上看到的东西,但如果您在实际工作中尝试这样做,它将无法通过任何理智的代码审查。
,#define ll long long
没有任何问题(除了您可能会将它与 11
混淆),它完全按照预期执行。
但是,转换为 ll(a)
的转换 long long(a)
是无效的(这种形式中不允许有空格)。
您需要使用 (ll)a
,它变成了 (long long)a
。
我应该提到,最好使用类型定义来执行此操作,而不是使用 #define
语句。那将是以下之一:
typedef long long ll
using ll = long long;
,
记住首先的类型转换方法,我们必须先用大括号写类型名,然后像这样(int)a
这样的变量。
在您的代码中,您误用了宏。您必须先编写关键字,然后编写您想要调用关键字的内容,例如 #define long long ll
然后您可以将 long long
用作 {{1} }.这就是您的代码遇到的所有问题。