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

Can(a==1

陆仲渊
2023-03-14

我们知道它可以用JavaScript实现。

但是,在Java中,是否可以在下面给出的条件下打印“Success”消息?

if (a==1 && a==2 && a==3) {
    System.out.println("Success");
}

有人建议:

int _a = 1;
int a  = 2;
int a_ = 3;
if (_a == 1 && a == 2 && a_ == 3) {
    System.out.println("Success");
}

但通过这样做,我们改变了实际变量。还有别的办法吗?

共有3个答案

井翰
2023-03-14

在这个问题中,@aioobe建议(并反对)对Java类使用C预处理器。

虽然这是一个非常骗人的问题,但这是我的解决方案:

#define a evil++

public class Main {
    public static void main(String[] args) {
        int evil = 1;
        if (a==1 && a==2 && a==3)
            System.out.println("Success");
    }
}

如果使用以下命令执行,它将只输出一个Success

cpp -P src/Main.java Main.java && javac Main.java && java Main
陶英纵
2023-03-14

使用一个精彩的代码高尔夫答案中的概念(和代码),整数值可以被弄乱。

在这种情况下,它可以使铸造为Integers的ints相等,而它们通常不相等:

import java.lang.reflect.Field;

public class Test
{
    public static void main(String[] args) throws Exception
    {
        Class cache = Integer.class.getDeclaredClasses()[0];
        Field c = cache.getDeclaredField("cache");
        c.setAccessible(true);
        Integer[] array = (Integer[]) c.get(cache);
        // array[129] is 1
        array[130] = array[129]; // Set 2 to be 1
        array[131] = array[129]; // Set 3 to be 1

        Integer a = 1;
        if(a == (Integer)1 && a == (Integer)2 && a == (Integer)3)
            System.out.println("Success");
    }
}

不幸的是,它不像欧文·博尔维特的多线程答案那么优雅(因为这个答案需要整数转换),但仍然发生了一些有趣的恶作剧。

张璞
2023-03-14

是的,如果您将变量a声明为volatile,那么使用多个线程很容易实现这一点。

一个线程不断地将变量a从1更改为3,另一个线程不断地测试a==1

(注意,如果您添加一个else{System.out.println(“Failure”);}子句,您将看到测试失败的次数远远多于成功的次数。)

实际上,它也可以在不声明a为易失性的情况下工作,但在我的MacBook上只有21次。如果没有易失性,编译器或HotSpot可以缓存a或用if(false)替换if语句。最有可能的是,HotSpot会在一段时间后启动并将其编译为缓存a值的程序集指令。随着的易失性,它将永远保持打印成功。

public class VolatileRace {
    private volatile int a;

    public void start() {
        new Thread(this::test).start();
        new Thread(this::change).start();
    }

    public void test() {
        while (true) {
            if (a == 1 && a == 2 && a == 3) {
                System.out.println("Success");
            }
        }
    }

    public void change() {
        while (true) {
            for (int i = 1; i < 4; i++) {
                a = i;
            }
        }
    }

    public static void main(String[] args) {
        new VolatileRace().start();
    }
}

 类似资料:
  • 类似于这个针对javascript的问题,它已经为各种不同的语言衍生出了许多副产品。我很好奇,在PHP中是否有以下情况:

  • 问题内容: I’m trying to create a function that will convert a given list into a given dictionary (where I can specify/assign values if I want). So for instance, if I have a list and I want to convert to a

  • 问题内容: I’m using Python’s Imaging Library and I would like to draw some bezier curves. I guess I could calculate pixel by pixel but I’m hoping there is something simpler. 问题答案: A bezier curve isn’t tha

  • Trash Can 是一个命令行下的回收站,提供一系列脚本用于在 ksh、bash 和 zsh 下运行,提供命令用于文件删除和恢复功能,同时提供从回收站中永久删除的命令。

  • Ember-can Simple authorisation addon for Ember. Installation Install this addon via ember-cli: ember install ember-can Compatibility Ember.js v3.20 or above Ember CLI v3.20 or above Node.js v12 or abo

  • CAN 简介 CAN 是控制器局域网络 (Controller Area Network, CAN) 的简称,是由以研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。 CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。