gpt4 book ai didi

c - 在没有循环或条件语句的情况下从 1 打印到 1000 的 C 代码如何工作?

转载 作者:太空狗 更新时间:2023-10-29 16:14:17 26 4
gpt4 key购买 nike

我找到了 prints from 1 to 1000 without loops or conditionalsC 代码:但我不明白它是如何工作的。任何人都可以检查代码并解释每一行吗?

#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);

调用 mainj+1 .

如果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:

A function designator is an expression that has function type. Except when it is the operand of the sizeof operator or the unary & operator, a function designator with type "function returning type" is converted to an expression that has type "pointer to function returning type".

exit是功能指示符。即使没有一元 & address-of 运算符,它被视为指向函数的指针。 (& 只是明确说明。)

函数调用在 §6.5.2.2/1 及以下内容中进行了描述:

The expression that denotes the called function shall have type pointer to function returning void or returning an object type other than an array type.

所以 exit(j+1)由于函数类型自动转换为指向函数的指针类型,并且 (&exit)(j+1) 有效。与指向函数指针类型的显式转换一样有效。

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

When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object; ...

添加(&main + ...)本身有效,并且可以使用,如果添加的数量为零,因为 §6.5.6/7 说:

For the purposes of these operators, a pointer to an object that is not an element of an array behaves the same as a pointer to the first element of an array of length one with the type of the object as its element type.

所以给&main加零会好的(但用处不大)。

关于c - 在没有循环或条件语句的情况下从 1 打印到 1000 的 C 代码如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7937789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com