为了了解++c/c++操作符是如何工作的,我试着运行以下C程序:
int c = 5;
c = c - c++;
printf("%d\n", c);打印1,我猜逻辑是++是在使用它的代码行之后应用的,所以c变成了= c - c ( 0 ),在“下一行”上它增加了1。但对我来说似乎很奇怪,我想更详细地了解在运营商优先方面应该发生什么。
现在谈一谈:
int c = 5;
c = c - ++c;
printf("%d\n", c);这张打印0,我真不明白为什么。如果从左到右解析了右手的值,我猜它会读取c ( 5 ),然后是++c (6),因为应该立即应用它。或者它是在整个右手值计算之前计算++c,所以它实际上是做6-6的,因为增量还涉及c的第一次调用
发布于 2019-12-08 05:50:37
对于C++ (所有版本的解释都适用于C++11及更高版本):
两者都有未定义的行为,这意味着不仅是它将返回未指定的值,还意味着它会导致整个程序以未定义的方式运行。
原因是表达式中的求值顺序仅为某些情况指定。计算表达式的顺序不遵循源代码中的顺序,与运算符优先级或相联性无关。在大多数情况下,编译器可以自由选择计算表达式的顺序,遵循一些一般规则(例如,运算符的计算是在运算数的值计算之后进行的,等等)。一些特定的操作数(例如&&和||的左手操作数)总是在其右手操作数之前进行排序。
特别是,未指定计算-操作数的顺序。据说,这两个操作数相对于另一个操作数是没有顺序的。这本身意味着我们不知道c在c - [...]的左边是在增量之前还是之后计算出c的值。
然而,还有一条更严格的规则,禁止使用标量对象(此处为c)的值计算的相对于对同一个标量对象的副作用不进行排序的方式。在您的示例中,++c和c++都会对c产生副作用,但是使用c - [...]左手侧的值时不会对它们进行排序。不遵循此规则将导致未定义的行为。
因此,您的编译器可以输出它想要的任何东西,您应该避免编写这样的代码。
有关C++的所有计算顺序规则的详细列表,请参阅cppreference.com。请注意,随着不同的C++版本的不同,它们发生了一些变化,使得越来越多以前未定义或未指定的行为被定义。但是,这些更改都不适用于您的特定情况。
https://stackoverflow.com/questions/59232658
复制相似问题