int foo(int c){
return c;
}
int main(void){
int a=5,c;
c = foo(--a) + a;
}
它会在C / C ++中调用未定义的行为吗?我想不,不会。
在阅读完所有答案之后,我无法弄清楚它是未定义的行为还是未指明的行为。
答案 0 :(得分:16)
是的,未定义的行为 - a
和foo(--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。