与问题相关的C代码:
#include <stdio.h>
int main(int argc, char **argv)
{
int k = 0;
double b = k++ + ++k + k--;
printf("%d", k);
return 0;
}
b
中存储的值未定义,但k
我找到这个地方的地方:
http://www.sanfoundry.com/online-c-test-precedence-order-evaluation/问题#10
- 编辑 -
到目前为止我发现了什么:
存储在b
中的值不会在任何地方使用,因此如果将某些内容存储到b
中将是唯一的UB,则此程序将不依赖于UB。
但我也在C99 6.5.2中找到了这一部分:
“在上一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次。”
在J.2下列出。未定义的行为:
“行为未定义......'''应'或''不得''出现在约束之外的要求被违反”
但实际问题尚未得到解答。
- 编辑#2 -
根据标准,并不是说我想写一个,而是一个'严格符合的程序':
“不得产生依赖于任何未指定,未定义或实现定义的行为的输出”
所以原始的例子是错误的,因为它确实依赖于未定义的行为,即使有人替换行也不会定义
double b = k++ + ++k + k--;
行
k++ + ++k + k--;
所以现在我正在寻找关于问题的更好的介绍。
答案 0 :(得分:5)
一旦我们遇到未定义的行为,编译器就可以做任何想做的事情 - 包括格式化磁盘(如果它具有访问权限)。因此在这种情况下无法定义任何内容,包括副作用。