我找到了C个代码,prints from 1 to 1000 without loops or conditionals个:

#include <stdio.h>
#include <stdlib.h>

void main(int j) {
  printf("%d\n", j);
  (&main + (&exit - &main)*(j/1000))(j+1);
}

推荐答案

永远不要写这样的代码.


对于j<1000,j/1000是零(整数除法).因此:

(&main + (&exit - &main)*(j/1000))(j+1);

相当于:

(&main + (&exit - &main)*0)(j+1);

即:

(&main)(j+1);

它用j+1main.

如果为j == 1000,则相同的行将显示为:

(&main + (&exit - &main)*1)(j+1);

这可以归结为

(&exit)(j+1);

这是exit(j+1)并且离开了程序.


(&exit)(j+1)exit(j+1)本质上是一样的——引用C99§6.3.2.1/4:

函数指示符是具有函数类型的表达式.除非是在

exit是一个函数指示符.即使没有运算符的一元&地址,它也被视为指向函数的指针.(&只是明确了这一点.)

和函数调用在§6.5.2.2/1及以下说明:

表示被调用函数的表达式应具有返回void或返回数组类型以外的对象类型的类型pointer to function.

因此,exit(j+1)可以工作,因为函数类型可以自动转换为指向函数的指针类型,而(&exit)(j+1)也可以与显式转换为指向函数类型的指针一起工作.

也就是说,上面的代码是不一致的(main要么接受两个参数,要么根本没有参数),我认为根据§6.5.6/9,&exit - &main是未定义的:

当减go 两个指针时,数组对象的最后一个元素之后为both shall point to elements of the same array object或1;.

由于§6.5.6/7规定:

在这些运算符中,指向不是

因此,将0添加到&main是可以的(但没有多大用处).

C++相关问答推荐

是否可以在C中进行D3 D12申请?

如何将FileFilter添加到FileDialog GTK 4

Ebpf内核代码:permission denied:invalid access to map value

空指针的运行时强制转换

C编译器是否遵循restrict的正式定义?

如何将字符**传递给需要常量字符指针的常量数组的函数

S的这种管道实施有什么问题吗?

如何按顺序将所有CSV文件数据读入 struct 数组?

是否定义了此函数的行为?

C语言中浮点数的取整方式浮点数尾数超过23位时如何取整剩余部分

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

Fprintf正在写入多个 struct 成员,并且数据过剩

有没有一种方法可以用C创建保留限定符的函数?

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

Matlab/Octave对conv2函数使用哪种方法?

Ubuntu编译:C中的文件格式无法识别错误

C struct 中的冒泡排序

如何找出C中分配在堆上的数组的大小?

为什么程序在打印每个数字之前要等待所有输入?

如何正确探测平台设备?