C/C++ Math Order of Operation

我只是一个虾纸丫 提交于 2019-11-28 13:47:39
jcoder

In your example the compiler is free to evaluate "1" "2" and "3" in any order it likes, and then apply the divisions left to right.

It's the same for the i++ + i++ example. It can evaluate the i++'s in any order and that's where the problem lies.

It's not that the function's precedence isn't defined, it's that the order of evaluation of its arguments is.

If you look at the C++ operator precedence and associativity, you'll see that the division operator is Left-to-right associative, which means this will be evaluated as (1/2)/3, since:

Operators that are in the same cell (there may be several rows of operators listed in a cell) are evaluated with the same precedence, in the given direction. For example, the expression a=b=c is parsed as a=(b=c), and not as (a=b)=c because of right-to-left associativity.

The first code snippet is undefined behaviour because variable i is being modified multiple times inbetween sequence points.

The second code snippet is defined behaviour and is equivalent to:

int i = (1 / 2) / 3;

as operator / has left-to-right associativity.

It is defined, it goes from left to right:

#include <iostream>

using namespace std;

int main (int argc, char *argv[]) {
    int i = 16/2/2/2;
    cout<<i<<endl;
    return 0;
}

print "2" instead of 1 or 16.

It might be saying that it is undefined because you have chosen an int, which is the set of whole numbers. Try a double or float which include fractions.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!