这是C / C ++中的未定义行为

时间:2011-03-22 09:53:58

标签: c++ c undefined-behavior

int foo(int c){
    return c;
}

int main(void){
    int a=5,c;
    c = foo(--a) + a; 
}

它会在C / C ++中调用未定义的行为吗?我想不,不会。

在阅读完所有答案之后,我无法弄清楚它是未定义的行为还是未指明的行为。

5 个答案:

答案 0 :(得分:16)

是的,未定义的行为 - afoo(--a)可以按任何顺序进行评估。

有待进一步参考,请参阅例如Sequence Point。在完整表达式之后有一个序列点,并且在评估foo的参数之后 - 但是未指定子表达式的评估顺序,每5/4:

  

除非另有说明,否则顺序为   评估个人的操作   运算符和子表达式   个人表达和秩序   发生副作用的是   不确定的。之间的   下一个序列指向一个标量   对象应具有其存储值   最多修改一次   表达的评价。   此外,先前的值应为   只访问以确定值   要存储。这个要求   应满足每一段   允许的订购   表达式的子表达式;   否则行为未定义。

编辑:正如Prasoon指出的那样,行为是未指定的,因为评估的顺序...未指定。,并且变为 undefined 由于,只能访问先前值以确定要存储的值

答案 1 :(得分:5)

您应该阅读this,它会告诉您您的代码未定义,因为+不是序列点,因此未定义f(--a)a首先评估。

答案 2 :(得分:3)

即使可以按任意顺序评估+运算符的操作数,行为也是未定义的,因为它违反了第二条规则

1)在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的计算修改一次。

2)此外,只能访问先前值以确定要存储的值

以下定义明确

c = foo(a-1) + a ;

阅读this FAQ entry以更好地理解未定义的行为和序列点。

答案 3 :(得分:2)

根据Wikipedia + 一个序列点,因此评估顺序不固定,因此您有未定义的行为。

答案 4 :(得分:-1)

你会在main函数中收到返回类型的警告,否则它就可以了,而在main()结束时c = 8。