Kapan (x == x + 2)? [Tutup]

90

Tantangannya: Tetapkan xsedemikian rupa sehingga ekspresi (x == x+2)akan dievaluasi menjadi benar.

Saya menandai pertanyaan dengan C, tetapi jawaban dalam bahasa lain dapat diterima, asalkan mereka kreatif atau menyoroti aspek menarik dari bahasa tersebut.

Saya bermaksud menerima solusi C, tetapi bahasa lain bisa mendapatkan suara saya.

  1. Benar - berfungsi pada implementasi yang sesuai standar. Pengecualian - dengan asumsi implementasi tipe dasar, jika itu implementasi umum (mis. Asumsi intadalah komplemen 32bit 2) adalah OK.
  2. Sederhana - harus berukuran kecil, gunakan fitur bahasa dasar.
  3. Menarik - saya akui itu subjektif. Saya punya beberapa contoh untuk apa yang saya anggap menarik, tetapi saya tidak ingin memberikan petunjuk. Pembaruan : Menghindari preprocessor itu menarik.
  4. Cepat - Jawaban bagus pertama akan diterima.

Setelah mendapatkan 60 jawaban (saya tidak pernah mengharapkan partisipasi semacam itu), mungkin baik untuk merangkumnya.

60 jawaban dibagi menjadi 7 kelompok, 3 di antaranya dapat diimplementasikan dalam C, sisanya dalam bahasa lain:

  1. Preprosesor C. #define x 2|0disarankan, tetapi ada banyak kemungkinan lain.
  2. Titik mengambang. Sejumlah besar, tak terbatas atau NaN semuanya berfungsi.
  3. Aritmatika petunjuk. Pointer ke struct besar menyebabkan menambahkan 2 untuk membungkus.

    Sisanya tidak bekerja dengan C:

  4. Operator overloading - A +yang tidak menambah atau ==yang selalu mengembalikan true.
  5. Membuat xpanggilan fungsi (beberapa bahasa mengizinkannya tanpa x()sintaks). Maka itu dapat mengembalikan sesuatu yang lain setiap kali.
  6. Tipe data satu bit. Lalu x == x+2 (mod 2).
  7. Mengubah 2- beberapa bahasa memungkinkan Anda menetapkannya 0.
ugoren
sumber
29
Mengapa 4. Quick? Maksud Anda "Siapa yang tahu satu dan cukup beruntung untuk membaca pertanyaan ini terlebih dahulu"?
Luc
6
@ugoren Biarkan komunitas memberikan suara (dan memilih diri sendiri untuk yang Anda suka), lalu pilih jawaban teratas setelah 7 hari atau lebih :)
Luc
3
Mengenai kemungkinan 2: NaN tidak bekerja. NaN + 2 lagi-lagi NaN, tetapi NaN == NaN salah.
Martin B
2
Solusi Scala, di mana x adalah Set yang berisi '2', dan + artinya add to Setoleh perpustakaan standar, tanpa mendefinisikan ulang +diri Anda, tidak masuk ke dalam 7 kategori ini, IMHO.
pengguna tidak diketahui
2
Mengapa pertanyaan ini dan semua jawaban Komunitas Wiki?
mbomb007

Jawaban:

71
main()
{
double x=1.0/0.0;
printf("%d",x==x+2);
}

Output 1.

Tautan: http://ideone.com/dL6A5

l0n3_sh4rk
sumber
7
float x=1./0sedikit lebih pendek dan mungkin lebih elegan. Tapi bagaimanapun, ini pasti adalah jawaban bagus pertama.
ugoren
1
Ahh pembagian tua yang baik dengan nol. Butuh waktu lebih lama untuk mencari tahu daripada yang ingin saya akui. haha
Hibah
Argh, saya juga memikirkan ini, tetapi pada Windows tidak dikompilasi jadi saya menjatuhkannya. :( +1 sekalipun
Tudor
x = 1e999 adalah cara lain untuk melakukan ini.
shiona
4
@shiona float x=1e20akan cukup
l0n3sh4rk
125

Fortran IV:

2=0

Setelah ini, setiap konstanta 2 dalam program adalah nol. Percayalah, saya telah melakukan ini (ok, 25 tahun yang lalu)

pengguna1497298
sumber
23
Lebih banyak alasan bagi saya untuk tidak pernah menyentuh Fortran.
C0deH4cker
3
Apakah setidaknya ada peringatan?
Michael Stern
15
@MichaelStern PERINGATAN: ANDA MENGUBAH NILAI 2!
Cruncher
100

Ini sepertinya berhasil:

#define x 2|0

Pada dasarnya, ekspresi diperluas ke (2|0 == 2|(0+2)). Ini adalah contoh yang bagus mengapa seseorang harus menggunakan tanda kurung ketika mendefinisikan makro.

Tolong berdiri
sumber
3
Pasti berfungsi, dan saya pikir itu solusi berbasis preprocessor paling elegan. Tapi saya pikir melakukannya tanpa persiapan lebih menarik.
ugoren
Apakah hanya saya atau harus 2|(0+2)menjadi 1?
phunehehe
1
@phunehehe: |adalah bitwise OR ; ||logis ATAU.
PleaseStand
20
Ini entah bagaimana mengingatkan saya pada Bobby Tables kecil.
vsz
1
@rakeshNS: Saya menambahkan set kurung tambahan untuk menunjukkan prioritas operator . Itu sebabnya saya berkata "Pada dasarnya".
PleaseStand
79

Brainfuck

x

Ini tentu saja sedikit meregangkan "mengevaluasi benar", karena dalam Brainfuck tidak ada yang benar-benar mengevaluasi apa pun - Anda hanya memanipulasi kaset. Tetapi jika sekarang Anda menambahkan ekspresi Anda

x
(x == x+2)

program ini setara dengan

+

(karena semuanya kecuali <>+-[],.komentar). Yang tidak melakukan apa-apa selain meningkatkan nilai di mana kita berada sekarang. Rekaman diinisialisasi dengan semua nol, jadi kita berakhir dengan 1 pada posisi kursor, yang berarti "benar": jika kita sekarang memulai bagian bersyarat [], itu akan masuk / loop.

berhenti mengubah counterclockwis
sumber
12
+1 Harus menjadi pelengkungan aturan yang paling kreatif.
ninjalj
3
Mengapa Anda membutuhkannya x?
James
3
@ James. Pertanyaannya mengatakan untuk mendefinisikan xjadi di sini xdidefinisikan sebagai x.
user80551
1
@ James, jawabannya tidak needapa - apa kecuali+
Cruncher
56

F #

let (==) _ _ = true
let x = 0
x == (x + 2) //true
Daniel
sumber
13
Saya suka yang ini. Alih-alih angka juggling, cukup mendefinisikan kembali arti ==
evilcandybag
4
Tunggu dulu, bukankah operator kesetaraan dalam F # sederhananya =? ==bahkan tidak didefinisikan secara default.
Jwosty
50

C

int main() { float x = 1e10; printf("%d\n", x == x + 2); }

Catatan: mungkin tidak berfungsi jika FLT_EVAL_METHOD != 0(lihat komentar di bawah).

Paul R
sumber
24
+1 untuk aplikasi dunia nyata. Terlalu banyak orang yang tidak mengerti matematika floating point.
Tim S.
1
@ mbomb007: Saya pikir mereka berbeda - jawaban yang Anda tautkan bergantung INF + 2 == INF, sedangkan jawaban saya menggunakan pelampung presisi tunggal yang cukup besar yaitu 2 kurang dari satu ULP.
Paul R
2
@ mbomb007: Saya juga berpikir mereka sangat berbeda - ∞ + 2 = ∞adalah sesuatu yang dapat dipahami oleh siapa pun dan tidak bergantung pada komputer apa pun yang spesifik, sedangkan menambahkan 2 ke angka konkret dan tidak memiliki efek sedikit lebih mengejutkan dan spesifik untuk presisi terbatas komputer, dan IMHO lebih menarik
GoatInTheMachine
1
Ini bisa gagal ketika FLT_EVAL_METHOD == 1matematika dilakukan double. Rekomendasikan nilai FP yang lebih besar pasti akan melebihi long doublepresisi seperti1.0e37f
chux
1
@ chux: terima kasih atas konfirmasi - itu pasti sesuatu yang mungkin perlu diwaspadai di masa depan, karena sebagian besar kode saya akhirnya menjadi lintas platform.
Paul R
36

C #

class T {
  static int _x;
  static int X { get { return _x -= 2; } }

  static void Main() { Console.WriteLine(X == X + 2); }
}

Bukan shortie, tapi agak elegan.

http://ideone.com/x56Ul

fjdumont
sumber
4
Sial, baru saja mendapat lencana 'Jawaban Bagus' untuk pos ini. Serius, mendapatkan lencana untuk hal-hal JAHAT ?! Jangan lakukan ini di rumah !
fjdumont
Itu jahat, tetapi sangat indah ...
Kevin
32

Scala: { val x = Set(2); (x == x + 2) }


Haskell: Tentukan ℤ / 2ℤ pada Booleans:

instance Num Bool where
    (+) = (/=)
    (-) = (+)
    (*) = (&&)
    negate = id
    abs    = id
    signum = id
    fromInteger = odd

maka untuk apa pun yang x :: Boolkita miliki x == x + 2.

Pembaruan: Terima kasih atas ide-ide dalam komentar, saya memperbarui contoh sesuai.

Petr Pudlák
sumber
3
Anda dapat menyederhanakan:fromInteger = odd
Rotsor
1
Juga (+)bisa didefinisikan seperti yang (/=)saya yakini.
MatrixFrog
2
Solusi yang lebih pendek adalah membuat contoh untuk ().
Thomas Eding
31

Python

class X(int):__add__=lambda*y:0
x=X()

# Then (x == x+2) == True
grc
sumber
Bagus. Semua bahasa yang mendukung overloading operator dapat menggunakan solusi serupa, tetapi C bukan salah satunya.
ugoren
Juga bekerja dengan kelebihan beban __cmp__sebagai class X(int):__cmp__=lambda*x:0(atau __eq__meskipun sedikit lebih lamaclass X(int):__eq__=lambda*x:True
dr jimbob
Beberapa karakter lebih pendek jika Anda tidak memperpanjang dari ..class X:__add__=lambda s,o:s
Doboy
Bolehkah saya bertanya apa yang multiplikasi lakukan?
seequ
2
@ Theare Ini sebenarnya bukan perkalian. Karena __add__biasanya diberikan beberapa argumen ( lambda x,y:), saya menyimpan beberapa karakter dengan menggunakan * untuk mengemas semua argumen menjadi tuple ( lambda *y:). Lihat dokumen untuk info lebih lanjut.
grc
31

GNU C mendukung struktur tanpa anggota dan ukuran 0:

struct {} *x = 0;
han
sumber
2
Sangat bagus! Saya berpikir tentang aritmatika pointer dengan data sangat besar yang mengarah ke sampul, tetapi tidak memikirkan yang sebaliknya.
ugoren
26

PHP:

$x = true;
var_dump($x == $x+2);

Atau:

var_dump(!($x==$x+2));

Keluaran:

bool (benar)

Dzhuneyt
sumber
1
Saya benar-benar mencoba untuk datang dengan jawaban PHP sederhana yang mati ini, tetapi Anda mengalahkan saya untuk itu.
PleaseStand
25

Ini adalah kesalahpahaman umum bahwa dalam C, spasi putih tidak masalah. Saya tidak bisa membayangkan seseorang belum menemukan ini di GNU C:

#include <stdio.h>
#define CAT_IMPL(c, d) (c ## d)
#define CAT(c, d) CAT_IMPL(c, d)
#define x CAT(a, __LINE__)

int main()
{
    int a9 = 2, a10 = 0;
    printf("%d\n", x ==
        x + 2);
    return 0;
}

Cetakan 1.

H2CO3
sumber
Bagus, meskipun mungkin secara teknis tidak valid ( x == x+2masih salah). Tapi begitu Anda memunculkan ide, saya pikir #define x -2*__LINE__lebih elegan.
ugoren
3
@ugoren terima kasih! Jika Anda ingin semua ini berada dalam satu baris, gunakan COUNTER sebagai ganti LINE - namun membutuhkan GCC 4.3+.
H2CO3
1
_CATadalah pengidentifikasi yang dilindungi undang-undang. Apa pun yang dimulai dengan garis bawah, dan huruf besar disediakan di C.
Konrad Borowski
@ perbaikan yang benar, diperbarui untuk menghapus UB.
H2CO3
20

C

Ini lebih menarik tanpa menggunakan macro dan tanpa menyalahgunakan infinity.

/////////////////////////////////////
// At the beginning                 /
// We assume truth!                 /

int truth = 1;
int x = 42;

/////////////////////////////////////
// Can the truth really be changed??/
truth = (x == x + 2);

/////////////////////////////////////
// The truth cannot be changed!     /
printf("%d",truth);

Cobalah jika Anda tidak percaya!

vsz
sumber
1
0. Tidak, masih belum percaya.
MSalters
@ MSalters: Kompiler apa yang Anda gunakan? Anda mungkin menonaktifkan trigraph.
vsz
VS2010. Sangat mungkin bahwa trigraph dinonaktifkan secara default. Entah itu atau penggabungan baris tidak bekerja dengan??\
MSalters
MSalters: trigraph ??\ harus dikonversi menjadi satu \ , jadi tidak ada ??\ . Namun beberapa kompiler modern memberikan peringatan secara default untuk trigraph dan baris gabungan bahkan jika diaktifkan.
vsz
18

Mathematica:

x /: x + 2 := x
x == x + 2

Saya pikir solusi ini adalah novel karena menggunakan konsep Nilai Up Mathematica .

SUNTING:

Saya memperluas jawaban saya untuk menjelaskan apa arti Nilai Up dalam Mathematica .

Baris pertama pada dasarnya mendefinisikan ulang penambahan untuk simbol x. Saya bisa langsung menyimpan definisi seperti itu dalam fungsi global yang dikaitkan dengan +simbol, tetapi definisi ulang seperti itu akan berbahaya karena redefinisi dapat menyebar secara tak terduga melalui algoritma bawaan Matematika .

Sebagai gantinya, menggunakan tag x/:, saya menghubungkan definisi dengan simbol x. Sekarang setiap kali Mathematica melihat simbol x, itu memeriksa untuk melihat apakah itu sedang dioperasikan oleh operator tambahan +dalam pola bentuk di x + 2 + ___mana simbol ___berarti kemungkinan urutan nol dari simbol lain.

Redefinisi ini sangat spesifik dan memanfaatkan kemampuan pencocokan pola yang luas dari Mathematica . Misalnya, ekspresi x+y+2kembali x+y, tetapi ekspresi x+3kembali x+3; karena dalam kasus sebelumnya, polanya dapat dicocokkan, tetapi dalam kasus yang terakhir, polanya tidak dapat dicocokkan tanpa penyederhanaan tambahan.

Carl Morris
sumber
1
Saya pikir Anda harus menjelaskan apa fungsinya. Kebanyakan orang tidak tahu Mathematica (atau apa Nilai Upnya).
ugoren
1
Terima kasih @ugoren, saya menghabiskan sebagian besar waktu saya di situs web Mathematica Stack Exchange, jadi saya lupa menjelaskan apa yang membuat contoh saya bermakna. Saya membuat edit yang menjelaskan konsep sesingkat mungkin.
Carl Morris
17

Javascript:

var x = 99999999999999999;
alert(x == x+2);​

Tes Fiddle

Briguy37
sumber
2
Anda dapat menggunakan Infinity, atau -Infinity, dan karena ini Anda dapat menggunakan pintasan x = 1/0.
zzzzBov
6
@zzzzBov: Itu pasti kode golf yang lebih baik. Saya memilih (99999999999999999 == 99999999999999999+2)karena saya pikir itu sedikit lebih menarik daripada (Infinity == Infinity+2), meskipun seperti kata OP, "itu subjektif" :)
Briguy37
Ini adalah satu-satunya kasus dunia nyata di mana saya melihat cek seperti ini untuk alasan yang baik (selain teka-teki pemrograman): Fungsi fakultas (berbasis float) memeriksa inputnya karena terlalu besar untuk dihitung mundur -1dan berulang . Bahasa itu sendiri adalah Python, tetapi itu tidak terlalu penting dalam kasus ini.
Alfe
5
@NicoBurns tidak mendatang :(
ajax333221
2
@NicoBurns, menjalankan kode di konsol menghasilkan false; di mana pun Anda mendapatkan informasi tentang JS itu salah dan tidak boleh dipercaya.
zzzzBov
17

skema

(define == =)
(define (x a b c d) #t)
(x == x + 2)
;=> #t
pengguna1651640
sumber
Bagus. Skema (x == x + 2)tampak seperti C, tetapi berarti hal yang sama sekali berbeda.
ugoren
1
Sekarang lakukan untuk (= x 2).
Joe Z.
(define (x a b c d) #t):)
Cruncher
@ugoren ini didefinisikan untuk melakukan ini oleh program ini. x hanyalah nama fungsi di sini. Dan begitu juga ==
Cruncher
16

Jawaban yang jelas:

Ketika ini berakhir:

while (x != x+2) { }
printf("Now");
daniero
sumber
1
+1 meta.codegolf.stackexchange.com/a/1070/8766 tapi ini sebenarnya cerdik.
user80551
1
Saya pikir while(!(x == x+2)) {}akan lebih semangat
Cruncher
Jawaban ini ada sebelum meta post dengan dua tahun. Segala sesuatu yang dianggap klise saat ini adalah novel di beberapa titik.
daniero
16

Berikut ini adalah solusi untuk JavaScript yang tidak mengeksploitasi kasus tepi Infinitydan -Infinitypenambahan floating-point. Ini tidak bekerja di Internet Explorer 8 dan di bawah atau dalam mode ketat opt-in ES5. Saya tidak akan menyebut withpernyataan dan getter terutama fitur "canggih".

with ({ $: 0, get x() {return 2 * this.$--;} }) {
    console.log(x == x+2);
}

Diedit untuk menambahkan: Trik di atas juga dimungkinkan tanpa menggunakan withdan get, seperti dicatat oleh Andy E dalam Tips untuk bermain golf di JavaScript dan juga oleh jncraton pada halaman ini:

var x = { $: 0, valueOf: function(){return 2 * x.$++;} };
console.log(x == x+2);
PleaseStand
sumber
Konsep yang bagus - membuat xpanggilan fungsi, meskipun sepertinya variabel dibaca. Saya mengasumsikan urutan evaluasi kiri-ke-kanan, tetapi tidak apa-apa karena ditentukan dalam JS (tidak seperti C).
ugoren
14

Yang berikut ini bukan standar yang sesuai C , tetapi harus bekerja pada hampir semua platform 64-bit:

int (*x)[0x2000000000000000];
han
sumber
Prinsipnya hebat, tetapi tampaknya diterapkan salah. xakan bertambah dalam langkah 2 ^ 61, jadi x + 8akan sama x.
ugoren
@ugoren, ini berfungsi untuk saya, di Linux dengan 4-byte int.
han
Anda benar sekali. Saya melewatkan fakta bahwa ini adalah array int, bukan char.
ugoren
10

Sage:

x=Mod(0,2)
x==x+2

mengembalikan True

Secara umum untuk GF (2 ** n) selalu benar bahwa x = x + 2 untuk setiap x

Ini bukan bug atau masalah dengan overflow atau infinity, itu sebenarnya benar

dspyz
sumber
1
Trik yang sama bekerja dengan PARI / GP
Hagen von Eitzen
10

Gangguan umum

* (defmacro x (&rest r) t)
X
* (x == x+2)
T

Sangat mudah ketika xtidak harus menjadi nilai aktual.

JB
sumber
8

APL (Dyalog)

X←1e15
X=X+2

APL bahkan tidak memiliki infinity, hanya saja mengapung tidak cukup tepat untuk membedakan antara 1.000.000.000.000.000dan 1.000.000.000.000.002. Sejauh ini yang saya tahu, ini satu-satunya cara untuk melakukan ini di APL.

marinus
sumber
Saya sangat suka ini karena ini adalah jawaban pertama untuk mengeksploitasi presisi float.
AndrewKS
1
@AndrewKS: Sebenarnya Paul R sedikit lebih awal.
MSalters
8

Perl 6

Saya terkejut tidak melihat solusi ini sebelumnya. Pokoknya, solusinya adalah - bagaimana jika xyang 0dan 2sekaligus? my \xdalam contoh ini menyatakan variabel sigilless - pertanyaan ini bertanya tentang x, bukan gaya-Perl $x. The ?? !!adalah operator ternary.

$ perl6 -e 'my \x = 0|2; say x == x + 2 ?? "YES" !! "NO"'
YES

Tapi...

$ perl6 -e 'my \x = 0|2; say x == x + 3 ?? "YES" !! "NO"'
NO

xadalah beberapa nilai sekaligus. xsama dengan 0dan 2sekaligus. x + 2sama dengan 2dan 4sekaligus. Jadi, secara logis mereka setara.

GlitchMr
sumber
8

Python 2.X (Menggunakan redefinisi integer (cache))

Saya perhatikan semua jawaban python telah mendefinisikan kelas yang mendefinisikan ulang + operator. Saya akan menjawab dengan demonstrasi fleksibilitas ular piton tingkat rendah. (Ini adalah potongan python2 khusus)

Dalam python, integer disimpan kurang lebih dengan cara ini di C:

typedef struct {            // NOTE: Macros have been expanded
    Py_ssize_t ob_refcnt;
    PyTypeObject *ob_type;
    long ob_ival;
} PyIntObject;

Artinya, struct dengan size_t, void *, dan longobjek, dalam urutan itu.
Setelah kita menggunakan, dan karena itu men-cache integer, kita dapat menggunakan ctypesmodul python untuk mendefinisikan kembali integer itu, sehingga tidak hanya melakukannya x == x+2, tetapi2 == 0

import ctypes
two = 2 # This will help us access the address of "2" so that we may change the value

# Recall that the object value is the third variable in the struct. Therefore,
# to change the value, we must offset the address we use by the "sizeof" a 
# size_t and a void pointer
offset = ctypes.sizeof(ctypes.c_size_t) + ctypes.sizeof(ctypes.c_voidp)

# Now we access the ob_ival by creating a C-int from the address of 
# our "two" variable, offset by our offset value.
# Note that id(variable) returns the address of the variable.
ob_ival = ctypes.c_int.from_address(id(two)+offset)

#Now we change the value at that address by changing the value of our int.
ob_ival.value = 0

# Now for the output
x = 1
print x == x+2
print 2 == 0

Cetakan

True
True
jsvk
sumber
7

Perl

menggunakan subrutin dengan efek samping pada variabel paket:

sub x () { $v -= 2 }
print "true!\n" if x == x + 2;

Keluaran: true!

memowe
sumber
1
sub x{}"Bekerja" juga .. (setidaknya di 5.10.1 saya), tetapi saya tidak tahu mengapa ..
mykhal
2
Karena sub x{}mengembalikan undef atau daftar kosong, yang keduanya merupakan angka nol. Dan x + 2 diuraikan sebagai x (+2). perl -MO=Deparsemengungkapkanprint "true\n" if x() == x(2);
Perleone
Itu luar biasa, @ mykhal dan @ Perleone!
memowe
7

Python

mengeksploitasi presisi floating point membuat ini sangat sederhana.

>>> x = 100000000000000000.0
>>> (x == x+2)
True

Untuk membuatnya kurang spesifik sistem, diperlukan impor tambahan

>>> import sys
>>> x = float(sys.maxint + 1)
>>> (x == x+2)
True

Ini juga bisa digunakan dalam bahasa lain. Ini bekerja karena reprensentasi 100000000000000000000.0 dan 100000000000000002.0 persis sama untuk mesin, karena cara floating point diwakili di dalam mesin. lihat http://en.wikipedia.org/wiki/IEEE_floating_point untuk informasi lebih lanjut.

Jadi ini pada dasarnya akan bekerja dalam bahasa apa pun yang memungkinkan Anda untuk menambahkan bilangan bulat ke float dan hasilnya adalah float.

Jens Timmerman
sumber
6

Berikut ini adalah solusi untuk C ++ berdasarkan overloading operator. Itu bergantung pada konversi implisit dari sebuah enumke int.

#include <iostream>

enum X {};
bool operator==(X x, int y)
{
    return true;
}

int main()
{
    X x;
    std::cout << std::boolalpha << (x == x+2) << std::endl;
    return 0;
}
Tolong berdiri
sumber
Anda bisa menggunakan std::boolalphabukan ?:.
Jon Purdy
5

Saya tahu ini tantangan kode ... tapi saya pegolf. Maaf.

Ruby - 13 karakter - Solusi Infinity

x=1e17;x==x+2

mengembalikan true

Ruby - 41 karakter - Solusi Op Overloading

class Fixnum;def + y;0 end end;x=0;x==x+2

atau

class A;def self.+ y;A end end;x=A;x==x+2
AndrewKS
sumber
5

Jika OK untuk mengeksploitasi pertanyaan sedikit, maka saya akan menambahkan beberapa Java baru. Triknya pasti bukan hal baru, tetapi mungkin menarik bahwa ini mungkin di Jawa.

static void pleaseDoNotDoThis() throws Exception {
    Field field = Boolean.class.getField("FALSE");
    field.setAccessible(true);
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
    field.set(null, true);
}

public static void main(String args[]) throws Exception {
    pleaseDoNotDoThis();
    doit(1);
    doit("NO");
    doit(null);
    doit(Math.PI);
}

static void doit(long x) {
    System.out.format("(x == x + 2) = (%d == %d) = %s\n", x, x+2, (x == x + 2));
}

static void doit(String x) {
    System.out.format("(x == x + 2) = (%s == %s) = %s\n", x, x+2, (x == x + 2));
}

static void doit(double x) {
    System.out.format("(x == x + 2) = (%f == %f) = %s\n", x, x+2, (x == x + 2));
}

Dan hasilnya:

(x == x + 2) = (1 == 3) = true
(x == x + 2) = (NO == NO2) = true
(x == x + 2) = (null == null2) = true
(x == x + 2) = (3,141593 == 5,141593) = true
(x == x + 2) = (Infinity == Infinity) = true
tb-
sumber
4

Solusi VBScript ini bekerja mirip dengan solusi JavaScript saya. Saya tidak menggunakan preprosesor namun solusinya tampaknya sepele.

y = 0
Function x
x = y
y = -2
End Function

If x = x + 2 Then
    WScript.Echo "True"
Else
    WScript.Echo "False"
End If
Tolong berdiri
sumber
Saya akan memposting solusi yang sama di ruby, sampai saya melihat milik Anda - itu mungkin karena kedua bahasa mengizinkan penghilangan kurung.
waldrumpus