C/C++ Math Order of Operation

若如初见. 提交于 2019-12-28 07:01:08

问题


So I know that C++ has an Operator Precedence and that

int x = ++i + i++;

is undefined because pre++ and post++ are at the same level and thus there is no way to tell which one will get calculated first. But what I was wondering is if

int i = 1/2/3;

is undefined. The reason I ask is because there are multiple ways to look at that (1/2)/3 OR 1/(2/3). My guess is that it is a undefined behavior but I would like to confirm it.


回答1:


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.




回答2:


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.




回答3:


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.




回答4:


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.




回答5:


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.



来源:https://stackoverflow.com/questions/11296854/c-c-math-order-of-operation

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