IF循环中的算术运算

时间:2012-12-28 17:45:22

标签: c

以下代码有什么作用?我对它的工作非常困惑。因为我认为if循环运行到int的范围。但是当我尝试打印i的值时,我很困惑。请帮帮我。

#include<stdio.h>

void main()
{
    static int i;
    for (;;)
        if (i+++”Apple”)
            printf(“Banana”);
        else
            break;
}

3 个答案:

答案 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)。