当前位置: 首页 > 知识库问答 >
问题:

真假宏的奇怪定义

赏彭薄
2023-03-14

我在一本编码书中看到了以下宏定义

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

没有任何解释。

请向我解释这些将如何作为TRUEFALSE工作。

共有3个答案

汝开畅
2023-03-14

这相当于写作

#define TRUE 1
#define FALSE 0

表达式'/'/'/'实际上是将字符/(无论其数值是什么)除以自身,因此它变成1

类似地,表达式'-'-'-'从自身减去字符-,计算结果为0

最好是写信

#define TRUE ('/'/'/')
#define FALSE ('-'-'-')

避免与其他优先级较高的运算符一起使用时意外更改值。

茹元魁
2023-03-14

这只是另一种写作方式

#define TRUE 1
#define FALSE 0

表达式'/'/'/'将把'/'的字符值除以自身,结果为1。

表达式'-'-'-'将把'-'的char值从自身减去,结果将为0。

但是,整个define表达式周围的括号缺失,这可能导致使用这些宏的代码出错。杰伊的回答很好地说明了这一点。

忘记括号可能有害的“现实”场景的一个例子是将这些宏与C样式的强制转换操作符结合使用。例如,如果有人决定在C中将这些表达式强制转换为bool

#include <iostream>

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

int main() {
    std::cout << "True: " << (bool) TRUE << std::endl;
    std::cout << "False: " << (bool) FALSE << std::endl;
    return 0;
}

以下是我们得到的:

True: 0
False: -44

因此(bool)TRUE将实际计算为false(bool)false将计算为TRUE

姚实
2023-03-14

让我们看看:'/'/'/'表示字符文字/,除以字符文字'/'本身。结果是一个,对于TRUE,这听起来很合理。

并且'-' - '-'表示从自身减去的char文字'-'。这是零(FALSE)。

这有两个问题:第一,它不可读。使用10绝对更好。此外,正如TartanLlama和KerrekSB所指出的,如果你打算使用该定义,请在其周围添加括号,这样你就不会有任何惊喜:

#include <stdio.h>

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

int main() {
        printf ("%d\n", 2 * FALSE);
        return 0;
}

这将打印charliteral'-'(在我的系统上为45)的值。

带括号:

#define TRUE  ('/'/'/')
#define FALSE ('-'-'-')

该程序正确地打印零,即使将真值乘以整数没有多大意义,但这只是一种意想不到的错误的例子,如果你不给宏加上括号,这些错误可能会咬你。

 类似资料:
  • 问题内容: 我的问题: 我有一个很大的JSON文件的数据集。我阅读并将其存储在变量中。 接下来,我对其进行预处理-以便能够使用它。 完成后,我便开始分类: 我使用交叉验证方法以获得平均准确度并训练分类器。 我进行了预测,并获得了该折痕的准确性和混乱度矩阵。 在此之后,我想获得的,,和值。我将使用这些参数来获得 敏感性 和 特异性 。 最后,我将使用它来放入HTML,以显示带有每个标签TP的图表。

  • 我知道其他人之前已经在StackOverflow上询问过这个问题,但是我已经尝试解决这个问题好几天了,但是没有任何结果。我的网站在电脑上看起来很棒,但当我在手机上测试时,显示屏的右侧出现了一个非常烦人的空白。 我试着... 设置溢出-X:隐藏在正文上; 设置溢出-X:隐藏在html上(它影响滚动); 在正文和HTML上设置宽度:100%; 我试着移除导航杆,它显然溢出了身体,但这并没有解决我的问题

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 我正在调试使用JPA / Hibernate和Postgres(9.6.2)的Java应用程序的奇怪行为。 应用程序有 3 个实体:用户、国家/地区、用户事件。 Hibernate将其映射到4个表:users、countries、userevent、Hibernate_sequences。 用户实体具有版本列 (@Version) 和用于乐观锁定的主题。@GeneratedValue(strate

  • 问题内容: 有人可以使用以下示例数据解释JavaScript Truthy和Falsy。我读过其他主题,但仍然感到困惑。 根据我的理解,我相信这是唯一的真理,而其余的都是虚假的-这是正确的吗? 问题答案: 据我了解,我相信var a = 1; 是唯一的真理,其余都是虚假的-这是正确的吗? 没有。 var a = 0; 数字零是 虚假的 。但是,请注意,字符串零是真实的。 var a = 10 ==

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么