#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
混淆(,它完全按照它应该做的做。
但是,转换为long long(a)
的强制转换ll(a)
是无效的(此形式中不允许使用空格(。
您需要使用(ll)a
,它将变为(long long)a
。
我应该提到,使用类型定义而不是#define
语句来实现这一点会更好。这将是其中之一:
typedef long long ll
using ll = long long;
记住类型转换方法,首先我们必须先用大括号写typename,然后像(int)a
这样写变量。
在您的代码中,您滥用了宏。你必须先写关键字,然后写你想用它来调用关键字的东西,比如#define long long ll
,然后你可以用long long
作为ll
。这就是代码中的所有问题。