使用预处理指令 #define for long long

如何解决使用预处理指令 #define for 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));

这是无效的,因为函数转换的类型名称,粗略地说,不能在顶层包含空格。因此,出于同样的原因,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} }.这就是您的代码遇到的所有问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?