下面的代码有什么作用?我对它的工作感到很困惑。因为我认为 if 循环一直运行到 int 的范围。但是当我尝试打印i
. 这个你能帮我吗。
#include<stdio.h>
void main()
{
static int i;
for (;;)
if (i+++”Apple”)
printf(“Banana”);
else
break;
}
下面的代码有什么作用?我对它的工作感到很困惑。因为我认为 if 循环一直运行到 int 的范围。但是当我尝试打印i
. 这个你能帮我吗。
#include<stdio.h>
void main()
{
static int i;
for (;;)
if (i+++”Apple”)
printf(“Banana”);
else
break;
}
它被解释为i++ + "Apple"
。因为i
是静态的并且没有初始化器,所以 i++ 产生 0。所以整个表达式是0 + some address
或等价于if ("Apple")
.
正如 Jonathan Leffler 在评论中正确指出的那样,我上面所说的仅适用于第一次迭代。之后它将继续增加i
并继续打印“香蕉”。
我认为在某些时候,由于溢出(如果它没有崩溃)"Apple" + i
会产生 0 并且循环会中断。再说一次,我真的不知道一个好意的编译器在添加一个指针和一个大数字时应该做什么。
正如 Eric Postpischil 评论的那样,您只能将指针前进,直到它指向已分配空间的一倍。在您的示例中,添加 7 将使指针超过分配的空间(“Apples\0”)。添加更多是未定义的行为,并且可能会发生技术上奇怪的事情。
使用int main(void)
而不是void main()
.
表达式i+++"Apple"
被解析为(i++) + "Apple"
; 字符串字面"Apple"
量从“6-element array of char
”类型的表达式转换为“pointer to char
”,其值是数组第一个元素的地址。该表达式i++
计算为 的当前值i
,并且作为副作用, in 的值i
增加 1。
因此,我们将整数表达式的结果添加到由表达式i++
产生的指针值"Apple"
;这给了我们一个新的指针值,它等于或大于"Apple"
. 所以假设字符串文字的地址"Apple"
是 0x80123450,那么基本上我们正在评估这些值
0x80123450 + 0
0x80123450 + 1
0x80123450 + 2
...
所有这些都应该评估为非零,这会导致printf
语句被执行。问题是当i++
导致整数溢出(其行为未明确定义)或i+++"Apple"
导致指针值溢出时会发生什么。目前尚不清楚这i+++"Apple"
是否会导致 0 值表达式。
这段代码应该是这样写的:
char *apple = "Apple";
for(i = 0; apple[i++];)
printf("Banana");
它不仅比原文中发布的代码更清晰,而且更清楚地看到它的作用。但我想这来自“看看我们用 C 写东西有多奇怪”。在 C 语言中有很多可能的东西不是一个好主意。
也可以学习在头上平衡一盘热食,以便为自己准备晚餐。这并不是一个特别好的主意——除非你没有手和脚,我想……;)
编辑:除非这是错误的......等效的是:
char *apple = "Apple";
for(i = 0; apple+i++ != NULL;)
printf("Banana");
在 64 位机器上,这需要一段时间。如果它在合理的时间内完成(将输出发送到 /dev/null),我会更新。在我的机器(AMD 3.4GHz Phenom II)上大约需要三分钟。