c++ - 为什么函数中b的第一个打印语句打印的是5而不是6?
问题描述
我很困惑。我希望函数中的第一个打印语句会打印 6 而不是 5。因为 a++ + c++ = (1+1) + (3+1) = (2+4 = 6)。
#include <iostream>
#include <string>
int main()
{
int a = 1;
int b = 2;
std::cout << "intitialisation b:"<< b << std::endl;
int c = 3;
{
auto b = ++a + c++;
std::cout << "increment b in function:" << b << std::endl;
auto e = b;
c += ++b;
std::cout << "increment b in function:" << b << std::endl;
}
std::cout << "increment b out function:" << b << std::endl;
int* p = &a;
int* q = &b;
std::cout <<"value pointer:" << *q << std::endl;
++(*q);
std::cout <<"value pointer:" << *q << std::endl;
*p += a++ + (*p)++;
}
intitialisation b:2
increment b in function:5
increment b in function:6
increment b out function:2
value pointer:2
value pointer:3
纳丁
解决方案
语句的行为
*p += a++ + (*p)++;
是未定义的。那是因为您在未排序的步骤中同时读取和写入a
(有时通过指针)。
这意味着整个程序是未定义的,也许有点自相矛盾,包括从概念上讲,在该程序之前已经运行的任何语句。这包括您要询问的具体声明!
撇开这一点不谈,++a
评估为 的增加值a
,c++
评估为 的未增加值c
。因此,如果您的代码中没有未定义的构造,则输出将为 2 + 3,即 5。
推荐阅读
- c++ - “单个变量作为语句”会做什么?
- sql - 如何在 SQL 中选择每年的日期范围
- php - 禁用 PHPUnit 中单个方法/构造函数的代码覆盖率
- reactjs - Redux 在内部使用上下文 API 吗?
- python - 每次输入字符时,如何使 if 语句打印一个字符串
- android - Jetpack Compose 减少选项卡的内部填充
- javascript - 使用reduce函数javascript获取键和值&键和对象
- algorithm - 将最大工作分配给一个人的算法,并且可以遗漏一些工作
- ubuntu - TypeError: Expected a message Descriptor, got Descriptor + tensorflow import problem in pytorch environment
- c++ - 在获取地址的上下文中,哪个是最专业的函数模板?