是否定义了C中未定义行为的副作用?

时间:2014-07-25 15:59:20

标签: c

与问题相关的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--;

所以现在我正在寻找关于问题的更好的介绍。

1 个答案:

答案 0 :(得分:5)

一旦我们遇到未定义的行为,编译器就可以做任何想做的事情 - 包括格式化磁盘(如果它具有访问权限)。因此在这种情况下无法定义任何内容,包括副作用。