Java 一行代码乘法表

Java 一行代码乘法表,java,c++,obfuscation,Java,C++,Obfuscation,一行代码似乎有误导性。我的意思是以一个for的形式 在尝试lambda表达式时,为了好玩,我编写了下面的程序。我所做的是将for循环的第三个表达式(通常是++I所在的位置)更改为lambda函数。还显示了输出。这就像一个模糊的代码,但它似乎做的工作,无论如何。我想知道是否可以用Java的类似方式来实现 for (int i=1; i<10; [](int i) {for (int j=2; j<10; ++j) printf("%dx%d=%2d ",j,i,i*j);}(i++))

一行代码似乎有误导性。我的意思是以一个for的形式

在尝试lambda表达式时,为了好玩,我编写了下面的程序。我所做的是将for循环的第三个表达式(通常是++I所在的位置)更改为lambda函数。还显示了输出。这就像一个模糊的代码,但它似乎做的工作,无论如何。我想知道是否可以用Java的类似方式来实现

for (int i=1; i<10; [](int i) {for (int j=2; j<10; ++j) printf("%dx%d=%2d ",j,i,i*j);}(i++)) printf("\n");

2x1= 2 3x1= 3 4x1= 4 5x1= 5 6x1= 6 7x1= 7 8x1= 8 9x1= 9 
2x2= 4 3x2= 6 4x2= 8 5x2=10 6x2=12 7x2=14 8x2=16 9x2=18 
2x3= 6 3x3= 9 4x3=12 5x3=15 6x3=18 7x3=21 8x3=24 9x3=27 
2x4= 8 3x4=12 4x4=16 5x4=20 6x4=24 7x4=28 8x4=32 9x4=36 
2x5=10 3x5=15 4x5=20 5x5=25 6x5=30 7x5=35 8x5=40 9x5=45 
2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 7x6=42 8x6=48 9x6=54 
2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 8x7=56 9x7=63 
2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 9x8=72 
2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81 
为了更好的可读性,我分离了For循环元素和lambda函数

for (int i=1; i<10; 
    [](int i) {
        for (int j=2; j<10; ++j) 
            printf("%dx%d=%2d ",j,i,i*j);
    } (i++)) 
{
    printf("\n");
}
我尝试插入类似于C++的int lambda函数,如int i—>{},但是对于java for循环,java语法似乎不正确。 当我读到这篇文章时,我很好奇。它是韩文,但是代码是C++的,所以我想任何人都可以读。首先是一部我不知道的韩剧的屏幕截图。第一张图显示了乘法的Java代码。似乎其中一个演员正在告诉另一个人,这可以用一行代码来完成

本文作者试图在C++中进行尝试。他在for循环语句中使用了多个由逗号分隔的printf。我所做的就是把它变成一个lambda函数

for (int i=1; i<10; 
    [](int i) {
        for (int j=2; j<10; ++j) 
            printf("%dx%d=%2d ",j,i,i*j);
    } (i++)) 
{
    printf("\n");
}

那么,有没有可能用Java以类似的方式实现呢?

好吧,我在回答我自己的问题

不像C++,java对循环控制变量语句似乎很严格。以任何形式输入lambda函数都会产生错误

所以,我所做的是使用单for循环和两个循环控制变量,就像这样

// Single for-loop
for (int i=1, j=2; i<10; i=(++j==10) ? i+1 : i, j=(j==10) ? 2 : j)
    System.out.format("%dx%d=%2d%c",j,i,i*j,(j==9) ? '\n' : ' ');
<>因为C++可以实现,所以我对C++源代码及其汇编代码中的两种方法都很好奇,

这里是C++代码缩进,以便更好的可读性,但是…,和/P>

// 1. Using lambda function
for (int i=1; i<10; 
    [](int i) {for (int j=2; j<10; ++j) 
        printf("%dx%d=%2d ",j,i,i*j);}(i++)) 
    printf("\n");

// 2. Using single for-loop
for (int i=1, j=2; i<10; i=(++j==10) ? i+1 : i, j=(j==10) ? 2 : j) 
    printf("%dx%d=%2d%c",j,i,i*j,(j==9) ? '\n' : ' ');
下面是生成的程序集NetBeans MinGW gcc。 使用lambda函数生成的代码比使用多个三值运算符的单for循环生成的代码要小

!    // 1. Using lambda function
!    for (int i=1; i<10; [](int i) {for (int j=2; j<10; ++j) printf("%dx%d=%2d ",j,i,i*j);}(i++)) printf("\n");
main(int, char**)()
main(int, char**)+22: movl   $0x1,-0xc(%ebp)
main(int, char**)+29: jmp    0x40172a <main(int, char**)+65>
main(int, char**)+31: movl   $0x40a06f,(%esp)
main(int, char**)+38: call   0x408248 <printf(char const*, ...)>
main(int, char**)+43: mov    -0xc(%ebp),%edx
main(int, char**)+46: incl   -0xc(%ebp)
main(int, char**)+49: lea    -0x15(%ebp),%eax
main(int, char**)+52: mov    %edx,(%esp)
main(int, char**)+55: mov    %eax,%ecx
main(int, char**)+57: call   0x4016a0 <operator()(int) const>
main(int, char**)+62: sub    $0x4,%esp
main(int, char**)+65: cmpl   $0x9,-0xc(%ebp)
main(int, char**)+69: setle  %al
main(int, char**)+72: test   %al,%al
main(int, char**)+74: jne    0x401708 <main(int, char**)+31>
!    
!    // 2. Using single for-loop
!    for (int i=1, j=2; i<10; i=(++j==10) ? i+1 : i, j=(j==10) ? 2 : j) printf("%dx%d=%2d%c",j,i,i*j,(j==9) ? '\n' : ' ');
main(int, char**)+76: movl   $0x1,-0x10(%ebp)
main(int, char**)+83: movl   $0x2,-0x14(%ebp)
main(int, char**)+90: jmp    0x4017a8 <main(int, char**)+191>
main(int, char**)+92: cmpl   $0x9,-0x14(%ebp)
main(int, char**)+96: jne    0x401752 <main(int, char**)+105>
main(int, char**)+98: mov    $0xa,%eax
main(int, char**)+103: jmp    0x401757 <main(int, char**)+110>
main(int, char**)+105: mov    $0x20,%eax
main(int, char**)+110: mov    -0x10(%ebp),%edx
main(int, char**)+113: imul   -0x14(%ebp),%edx
main(int, char**)+117: mov    %eax,0x10(%esp)
main(int, char**)+121: mov    %edx,0xc(%esp)
main(int, char**)+125: mov    -0x10(%ebp),%eax
main(int, char**)+128: mov    %eax,0x8(%esp)
main(int, char**)+132: mov    -0x14(%ebp),%eax
main(int, char**)+135: mov    %eax,0x4(%esp)
main(int, char**)+139: movl   $0x40a071,(%esp)
main(int, char**)+146: call   0x408248 <printf(char const*, ...)>
main(int, char**)+151: incl   -0x14(%ebp)
main(int, char**)+154: cmpl   $0xa,-0x14(%ebp)
main(int, char**)+158: jne    0x40178f <main(int, char**)+166>
main(int, char**)+160: mov    -0x10(%ebp),%eax
main(int, char**)+163: inc    %eax
main(int, char**)+164: jmp    0x401792 <main(int, char**)+169>
main(int, char**)+166: mov    -0x10(%ebp),%eax
main(int, char**)+169: mov    %eax,-0x10(%ebp)
main(int, char**)+172: cmpl   $0xa,-0x14(%ebp)
main(int, char**)+176: je     0x4017a0 <main(int, char**)+183>
main(int, char**)+178: mov    -0x14(%ebp),%eax
main(int, char**)+181: jmp    0x4017a5 <main(int, char**)+188>
main(int, char**)+183: mov    $0x2,%eax
main(int, char**)+188: mov    %eax,-0x14(%ebp)
main(int, char**)+191: cmpl   $0x9,-0x10(%ebp)
main(int, char**)+195: setle  %al
main(int, char**)+198: test   %al,%al
main(int, char**)+200: jne    0x401745 <main(int, char**)+92>

当然你可以不使用换行符,这里有多个语句,你只是对标识或换行符一窍不通,就像编译器一样……在java中,你可以在一行中做任何事情。这是一种类似c++的自由形式语言,谢谢你的评论。我已经编辑了这个问题,希望它能更清楚地知道我想知道的:java lambda函数用法示例,类似C++。