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

该代码如何打印404?

邓嘉致
2023-03-14

我从堆栈溢出的404 Not Found错误页面复制了下面的代码。

# define v putchar
# define print(x)
main(){v(4+v(v(52)-4));return 0;}/*
#>+++++++4+[>++++++<-]>
++++.----.++++.*/
print(202*2);exit();
#define/*>.@*/exit()

上面的代码编译精细,在控制台上打印404。我以为语句print(202*2);负责打印404,但我不对,因为更改此语句中的数字也打印404。

有人能帮我理解这个代码以及它是如何打印404的吗?

我发布编译输出供您参考,因为有评论说此代码无法编译。包含上述代码的文件是Test. c。

gcc测试。c-o测试

测验c: 3:1:警告:返回类型默认为“int”[-Wimplicit int]main(){v(4 v(v(52)-4));返回0;}/*^测验c: 在函数“main”中:测试。c: 1:12:警告:函数“putchar”[-Wimplicit函数声明]#define v putchar^ Test的隐式声明。c: 3:8:注意:在宏“v”main()的展开中{v(4 v(v(52)-4));返回0;}/*^测验c: 顶层:测试。c: 6:14:警告:数据定义没有类型或存储类打印(202*2);退出();^测验c: 6:14:警告:在“exit”[-Wimplicit int]测试的声明中,类型默认为“int”。c: 6:14:警告:内置函数“exit”的类型冲突

./测验

404

共有3个答案

魏高邈
2023-03-14

代码不能在标准C编译器上编译,例如gcc-std=c11-pedantic错误。

1) 在托管系统上,main必须返回int
2)putchar()必须包含

在修复了这些初级错误并删除了所有除了创建编译器错误之外没有任何作用的多余绒毛之后,我们只剩下以下内容:

#include <stdio.h>
#define v putchar
int main(){v(4+v(v(52)-4));return 0;}

这围绕返回所写字符的putchar展开:

putchar(4+putchar(putchar(52)-4));
  • 52是ASCII,表示“4”。打印4

就这样。就混淆尝试而言,非常暗淡。

适当的、符合标准的混淆宁愿看起来像这样:

#include <stdio.h>
#include <iso646.h>

??=define not_found_404(a,b,c,d,e,f,g,h,i,j)a%:%:b%:%:c%:%:d%:%:e%:%:f(\
(g%:%:h%:%:i%:%:j<::>)<%'$'+d##o%:%:e not "good",g??=??=ompl ??-- -0163l,\
((void)(0xBAD bito##b not "bad"),not "ugly")??>,(g%:%:h%:%:i%:%:j??(??)){\
((c%:%:d%:%:e)- -not "lost")     <:??=a??) -??-??- '<',\
((c%:%:d%:%:e)- -not "found")    <:??=b??) -??-??- 'B',\
((c%:%:d%:%:e)- -not 0xDEADC0DE) <:??=c??) -??-??- '5',\
((c%:%:d%:%:e)- -6##6##6 xo##b- -6##6##6)%>)

int main()
{
  not_found_404(p,r,i,n,t,f,c,h,a,r);  
}
韩晋
2023-03-14
匿名用户

# define v putchar

这将v定义为putchar()函数。它打印一个字符并返回

# define print(x)

这将打印(x)定义为无(因此打印(202*2)表示无)

main(){v(4+v(v(52)-4));return 0;}/*

这可以改写为:

main()
{
  putchar(4 + putchar(putchar(52) - 4));
  return 0;
}

它使用ASCII码打印“4”(代码52)、“0”(代码52-4=38)和“4”,因此为“404”。

该行以一个开始注释的/*结尾,继续下两行:

#>+++++++4+[>++++++<-]>
++++.----.++++.*/

下面的行是空的,但这有点棘手,因为out()在行本身之后被定义为空。这是有效的,因为C预处理器在编译之前运行。

print(202*2);exit();

下一行将exit()定义为空,用于上一行。

#define/*>.@*/exit()

孙俊彦
2023-03-14

不能将元问题用作欺骗,如此明目张胆地抄袭MSO的答案

由于这是标记c并提到“已编译”,所以只需提取它的c部分。

字幕:马克·鲁沙科夫是《通晓多种语言》的原作者。

C代码相当容易阅读,但如果通过预处理器运行,则更容易阅读:

main(){putchar(4+putchar(putchar(52)-4));return 0;};exit();

您的标准main函数在那里声明,并且out也被声明为隐式返回类型为int的函数(out实际上被忽略)。

putchar被使用是因为您不需要任何#include来使用它;您给它一个整数参数,它将相应的ASCII字符放入标准输出并返回您给它的相同值。所以,我们放52(即4);然后我们减去4并输出0;然后我们添加4以再次输出4

还有,科尔·约翰逊的(https://meta.stackoverflow.com/users/1350209/cole-johnson)答案

忽略所有这些,当我们稍微重新格式化代码,并将其替换为ASCII等价物('4')时,我们得到:

int main() {
    putchar(4 + putchar(putchar('4') - 4));
    return 0;
}

至于putchar声明,它由标准定义以返回其输入,如realloc。首先,该程序打印一个4,然后取ASCII值(52),减去4(48),打印(ASCII0),添加4(52),打印(4),最后终止。这将产生以下输出:

404

不幸的是,由于C需要函数的显式返回类型,所以这个多语言图是有效的C。该程序利用了C要求没有显式返回类型的函数为int的事实。

 类似资料:
  • 问题内容: 我发现了这种奇怪: 输出: 这是如何运作的? 问题答案: 该数字适合64位,其二进制表示为: 程序从右到左为每个5位组解码一个字符 对于5位,可以表示2 = 32个字符。英文字母包含26个字母,因此除字母外还留出32-26 = 6个符号的空间。通过这种编码方案,您可以拥有全部26个(一种情况)的英文字母和6个符号(其中是空格)。 算法说明 该从组到组中的for循环跳跃,则5位组被分离安

  • $ gdb -q `which gdb` (gdb) l 15 16 You should have received a copy of the GNU General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 18

  • 问题内容: 我正在将Python 2.7与Selenium WebDriver一起使用。我的问题是如何使用方法打印整个页面源。有webdriver方法,但是它返回WebDriver,我不知道如何将其转换为String或仅在终端中打印 问题答案: 在一个实例上,您需要的是:

  • 问题内容: public class MyClass { ClassABC abc = new ClassABC(); } 我只有ClassABC的.class文件。我想打印“ abc”对象的所有公共,私有,受保护和默认字段值。如何使用反射来做到这一点? 问题答案: 您可以通过获取所有字段。每个返回一个对象,您可以依次使用该方法获取值。要获取非公共字段的值,只需设置为。 因此,简而言之: 也可以看

  • 问题内容: 搜索过,但没有找到满意的答案。 我知道没有可移植的方式来打印pthread_t。 您如何在您的应用程序中做到这一点? 更新: 实际上,我不需要pthread_t,但是需要一些小的数字ID,以便在调试消息中标识不同的线程。 在我的系统(64位RHEL 5.3)上,它被定义为unsigned long int,因此它的数量很大,仅打印它就在调试行中占据了宝贵的位置。 gdb 如何 分配 短

  • 本文向大家介绍C#条码生成及打印实例代码,包括了C#条码生成及打印实例代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C#条码生成及打印的方法,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。