首页 > 编程语言 >奇妙的 c++ 混合运算式

奇妙的 c++ 混合运算式

时间:2024-07-19 20:07:51浏览次数:15  
标签:运算 INT MAX ll c++ long 奇妙

先来看看如下的式子:

a * b + c

当你在 c++ 中运行它时,你很清楚它是先计算 * 再计算 + 的。

那么请再来看看这个式子:

a + b + c

请问它是先执行第一个 +,还是先执行第二个 + 呢?

这个问题看上去无解,但实际上我们可以解答:

#define ll long long

int a = INT_MAX, b = INT_MAX;
ll c = 0;
ll d = a+b+c;
cout<<d<<endl;

运行上述代码,容易发现输出的结果为 -2。但正确的答案实际为 4294967294。为什么会这样呢?

答案很明显,这里发生了整形溢出。为了充分发扬物理中的控制变量思想,我们不妨再试着改动一下:

#define ll long long

int a = INT_MAX, b = INT_MAX;
ll c = 0;
ll d = a+c+b;
cout<<d<<endl;

这时的答案就变成了 4294967294

这样我们就成功验证了 c++ 中同级运算的运算顺序为从左到右

另外,上面的试验还告诉了我们 c++ 运算的另一条性质:c++ 中类型强制转换发生在一个二元运算符的两侧

所以,以后做那种 long long 和 int 混杂的题目时需要注意:在混合运算的式子中,只有一个 long long 变量可能不够,要注意别处(比如两个大 int 的乘法)的溢出问题;并且,尽量将 long long 放在式子的开头。

标签:运算,INT,MAX,ll,c++,long,奇妙
From: https://www.cnblogs.com/David-Mercury/p/18312289

相关文章

  • C++类和对象 后篇
    C++类和对象后篇构造函数的初始化列表......
  • 采用反相正基准电压电路的反相运算放大器(运放)
    采用反相正基准电压电路的反相运算放大器(运放)采用反相正基准电压电路的同相运算放大器(运放)设计目标输入ViMin输入ViMax输出VoMin输出VoMax电源电压Vcc电源电压Vee电源电压Vref-5V-1V0.05V3.3V5V0V5V设计说明1此设计使用具有反相正基准的反相放大器将–5V至–1V的输......
  • c++一句话求前缀和,不用循环
    partial_sum是C++标准库中的一个函数,用于计算给定范围内元素的部分和。它接受三个参数:起始迭代器(包含在计算范围内的第一个元素)结束迭代器(不包含在计算范围内的最后一个元素)输出迭代器(存储部分和结果的起始位置)在这个例子中,a.begin()+1表示从数组a的第二个元素开始计......
  • C++ 定义静态数据成员简单测试
    #include<iostream>#include<string>namespace{classA{public:voidaddCount(){++sumCount;}staticintgetSumCount(){returnsumCount;}private:......
  • Facebook 开源 C++ 框架 Ocean:用于计算机视觉和增强现实
    Facebook开源C++框架Ocean:用于计算机视觉和增强现实来源:OSCHINA编辑: 局2024-07-1211:05:00 0Facebook开源了其内部用于计算机视觉(CV)和增强现实(AR) 应用程序的框架Ocean,用于执行各种任务,包括计算机视觉、几何、媒体处理、网络和渲染。Ocean......
  • C++多线程
    多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行。多线程程序包含可以同时运行的两个或多个......
  • C语言运算符
    1.算术运算符+加法-减法*乘法/除法%取余 计算时,数据类型不一样的不能直接运算,需要转换成一样的才能运算,有两种转换方式。1.1隐式转换把一个取值范围小的,转换为取值范围大的,隐式转换是计算机自己就可以完成的,不会产生错误的。数据类型从大的到小的顺序为:double>float>lon......
  • C++宏魔法:__VA_OPT__操作
    在阅读chromium源码的时候,在\blinkrendercore的base\check.h头文件中,发现了这个定义:#defineCHECK(condition,...)\LOGGING_CHECK_FUNCTION_IMPL(\::logging::C......
  • C++ 智能指针
    一、为什么需要智能指针看如下代码有什么问题:intdiv(){ inta,b; cin>>a>>b; if(b==0) throwinvalid_argument("除0错误"); returna/b;}voidFunc(){ //1、如果p1这里new抛异常会如何? //2、如果p2这里new抛异常会如何? //3、如果div调用这里又......
  • 【C++】学习笔记——AVL树
    文章目录十六、AVL树1.AVL树的概念2.AVL树节点的定义3.AVL树的插入4.AVL树的旋转5.AVL树的验证6.完整代码+测试7.AVL树的性能未完待续十六、AVL树1.AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素......