C/C++ 运算的数学顺序
C/C++ Math Order of Operation
所以我知道C++有一个运算符优先级,并且
int x = ++i + i++;
未定义,因为 pre++ 和 post++ 处于同一级别,因此无法判断哪个将首先被计算。但我想知道的是,如果
int i = 1/2/3;
未定义。我问的原因是,有多种方法可以查看(1/2)/3或1/(2/3)。我的猜测是这是一种未定义的行为,但我想确认一下。
如果您查看C++运算符优先级和关联性,您会发现除法运算符是从左到右关联的,这意味着这将被评估为 (1/2)/3
,因为:
同一单元格中的运算符(单元格中可能列出了几行运算符)在给定方向上以相同的优先级进行评估。例如,表达式 a=b=c 被解析为 a=(b=c),而不是 (a=b)=c,因为从右到左的关联性。
在您的示例中,编译器可以自由地以它喜欢的任何顺序计算"1"2"和"3",然后从左到右应用除法。
对于 i++ + i++ 示例也是如此。它可以以任何顺序评估 i++,这就是问题所在。
这并不是说函数的优先级没有定义,而是它的参数的计算顺序是。
第一个代码片段是未定义的行为,因为变量i
在序列点之间被多次修改。
第二个代码片段是定义的行为,等效于:
int i = (1 / 2) / 3;
作为运算符/
具有从左到右的关联性。
它被定义,它从左到右:
#include <iostream>
using namespace std;
int main (int argc, char *argv[]) {
int i = 16/2/2/2;
cout<<i<<endl;
return 0;
}
打印"2"而不是 1 或 16。
它可能说它是未定义的,因为你选择了一个整数,它是整数的集合。尝试包含分数的双精度或浮点数。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 数到第n个楼梯的路(顺序无关紧要)
- GCC本机矩阵运算库
- 优先顺序:智能指针和类析构函数
- 在循环中按顺序遍历成员变量
- 独立读取-修改-写入顺序
- QML按钮点击功能执行顺序
- C++中数据类型修饰符的顺序
- 当比特(而不是字节)的顺序至关重要时的持久性
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 通过选项卡的文本设置QTabWidget顺序
- c++11评估顺序(未定义的行为)
- 位阵列上的快速AND运算
- C/C++ 运算的数学顺序
- 为什么 bool 显示正确的位顺序,而直接输出移位运算结果却不显示?
- 返回类型取决于算术运算的顺序.对吗?