#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 有什么问题。
#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));
using ll = long long;
或者使用(ll)a
,因为在这种情况下允许使用空格。
但如果我是你,我会摆脱ll
并使用(long long)a
,因为ll
是一个不太具有描述性的名称。
请注意,#define ll long long
是宏定义的误用,有很多问题:
这容易让人困惑。从看到ll maxi = 1;
,一个合理的人会期望ll
是一种类型,并且ll(a)
可以正常工作。如果它不是宏定义,它就能正常工作。
短名可能会与其他东西产生冲突。如果您将此#define
放在头文件中,然后包含另一个使用单词ll
的头文件,无论任何目的,它都会出现错误。
为了避免这种情况,宏应该具有长而可怕的大写字母名称。
宏应该是最后的紧急选项,在所有其他方法失败时使用,而不仅仅是因为您不想输入一些额外的字母。
这是您在竞赛编程网站上看到的东西,但如果您在实际工作中尝试这样做,它将无法通过任何合理的代码审查。
#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
作为ll
。这就是您代码中的所有问题。
long long(a)
无法编译,但 int(a)
可以编译通过。 “你必须先写关键字”我并不完全理解这个想法,但是 #define long long ll
是错误的。 它会将 long
替换为 long ll
,这几乎没有意义。(更不用说重复使用关键字例如 long
作为宏名称是非法的,您必须自己想出名称。)OP原始的宏更有意义。 - HolyBlackCat
int64_t
而不是ll
。是的,我知道这多了几个字符,但它可以提高可读性。 - drescherjm