gpt4 book ai didi

c++ -++c 和 c++ 增量何时应用在这里?

转载 作者:行者123 更新时间:2023-12-01 21:15:13 25 4
gpt4 key购买 nike

只是为了看看我对 ++c 的理解有多少/c++运算符有效,我尝试运行这些 C 程序:

int c = 5;
c = c - c++;
printf("%d\n", c);

打印1,我猜逻辑是++在使用它的代码行之后应用,所以c变成= c - c这是 0,并且在“下一行”它增加了 1。但这对我来说似乎很奇怪,我想更详细地了解运算符(operator)优先级会发生什么。

现在开始:

int c = 5;
c = c - ++c;
printf("%d\n", c);

这个打印 0,我不太明白为什么。如果从左到右解析右手值,我想它会显示 c即 5,则 ++c这是 6,因为它应该立即应用。或者它计算 ++c在整个右手值计算之前,因此它实际上执行 6 - 6,因为增量还涉及第一次调用 c

最佳答案

对于 C++(所有版本,说明适用于 C++11 及更高版本):

两者都有未定义的行为,这意味着它不仅返回未指定的值,而且会导致整个程序以未定义的方式运行。

这样做的原因是表达式内的求值顺序仅在某些情况下指定。表达式的计算顺序不遵循源代码中的顺序,并且与运算符优先级或结合性无关。在大多数情况下,编译器可以自由选择计算表达式的顺序,遵循一些通用规则(例如,运算符的计算在其操作数的值计算之后等)和一些特定的规则(例如 &&|| 的左侧操作数始终其右侧操作数之前排序)。

特别是 - 的操作数的求值顺序是未指定的。据说这两个操作数相对于彼此无序。这本身意味着我们不知道 c - [...] 左侧的 c 是否会计算出 c 的值 在增量之前或之后。

然而,有一个更严格的规则,禁止以相对于同一标量对象上的副作用而言无序的方式使用标量对象(此处为 c)的值计算。在您的情况下, ++cc++ 都会对 c 产生副作用,但它们通过使用左侧的值而没有排序c - [...] 的一侧。不遵循此规则会导致未定义的行为。

因此,您的编译器可以输出任何它想要的内容,您应该避免编写这样的代码。

C++所有求值顺序规则的详细列表,参见 cppreference.com 。请注意,它们随着不同的 C++ 版本而发生了一些变化,使得越来越多的以前未定义或未指定的行为被定义。但这些更改均不适用于您的特定情况。

关于c++ -++c 和 c++ 增量何时应用在这里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59232658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com