所以我有这个main

#define NUM 5

int main()
{
    int a[NUM]={20,-90,450,-37,87};
    int *p;

    for (p=a; (char *)p < ((char *)a + sizeof(int) * NUM); )  //same meaning: for (p=a; p<a+NUM;)
        *p++ = ++*p < 60 ? *p : 0;  //same meaning: *(p++)=++(*p)<60?*p:0;

    for(p=a; (char *)p < ((char *)a + sizeof(int) * NUM); )
        printf("\n %d ", *p++);

    return 0;
}


而且我需要找到什么输出。
因此,在尝试不加理解的情况下,我运行了它,这是输出:

21
 -89
 0
 -36
 0


因此,我很乐意向您解释如何解决此类问题(我很快就会参加考试,并且可能会看到这类问题。)

编辑:

首先,我想了解第一个for语句在做什么:

此跳转1 integer吗?以及块内发生了什么?

*p++++*p有什么区别

最佳答案

该问题与Why are these constructs (using ++) undefined behavior in C?相似,尽管由于?:运算符内的(细微)序列点,所以并非完全相同。

由于程序包含未定义的行为,因此没有可预测的输出。

尽管由于++*p运算符的内部序列点,与*p相比,子表达式?:的排序方式明确,但是对于子表达式的其他组合而言,情况并非如此。最值得注意的是,未指定对=的操作数的求值顺序:

C11 6.5.15 / 3:


  操作数的评估是无序列的。


*p++没有相对于++*p排序。子表达式的求值顺序未指定,并且由于同一变量上存在多个未排序的副作用,因此行为是不确定的。

同样,相对于*p++*p也没有顺序。这也会导致不确定的行为。

简介:该代码已损坏,并且充满错误。什么都可能发生。谁给你的任务是无能的。

关于c - C语言:查找给定程序的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48638821/

10-11 22:57
查看更多