以下代码有什么作用?我对它的工作非常困惑。因为我认为if循环运行到int的范围。但是当我尝试打印i
的值时,我很困惑。请帮帮我。
#include<stdio.h>
void main()
{
static int i;
for (;;)
if (i+++”Apple”)
printf(“Banana”);
else
break;
}
答案 0 :(得分:3)
它被解释为i++ + "Apple"
。由于i
是静态的并且没有初始化器,因此i ++产生0.因此整个表达式为0 + some address
或等同于if ("Apple")
。
正如Jonathan Leffler在评论中正确指出的那样,我上面所说的仅适用于第一次迭代。之后它将继续增加i
并继续打印“香蕉”。
我认为在某些时候,由于溢出(如果它没有崩溃)"Apple" + i
将产生0并且循环将中断。同样,当我添加一个指针和一个大数字时,我真的不知道一个好的编译器应该做什么。
正如Eric Postpischil评论的那样,你只能推进指针,直到它指向一个已经分配的空间。在您的示例中,添加7将使指针超过分配的空间(“Apples \ 0”)。添加更多是未定义的行为,技术上可能会发生奇怪的事情。
答案 1 :(得分:2)
使用int main(void)
代替void main()
。
表达式i+++"Apple"
被解析为(i++) + "Apple"
;字符串文字"Apple"
从类型为“{-1}}的6元素数组”的表达式转换为“指向char
的指针”,其值是第一个元素的地址阵列。表达式char
评估为i++
的当前值,而作为副作用,i
中的值加1。
因此,我们将整数表达式i
的结果添加到由表达式i++
得到的指针值中;这给了我们一个新的指针值,它等于或大于"Apple"
的地址。所以假设字符串文字"Apple"
的地址是0x80123450,那么基本上我们正在评估值
"Apple"
所有这些都应该计算为非零,这会导致0x80123450 + 0
0x80123450 + 1
0x80123450 + 2
...
语句被执行。问题是当printf
导致整数溢出(其行为未明确定义)或i++
的值导致指针值溢出时会发生什么。目前尚不清楚i+++"Apple"
是否会产生0值表达式。
答案 2 :(得分:1)
这段代码应该是这样写的:
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)。