关于C++输出流cout的执行顺序问题

首先看一个例子:

int fun1()
{
 cout<<"num1"<<endl;
 return 1;
}

int fun2()
{
 cout<<"num2"<<endl;
 return 2;
}

int main()
{
 cout<<fun1()<<"  "<<fun2()<<endl;
 return 0;
}

 

输出结果是

num2

num1

 2

为什么呢?为什么不是num11num22呢?这里涉及到cout输出流的执行顺序问题。

cout的输出顺序有如下规律:

计算顺序:自右至左

输出顺序:自左至右

 

cout作为输出流,有一个缓冲区,先从右往左将输出读入缓冲区,在从缓冲区中读出(类似堆栈)

假设a = 1; b = 2; c = 3;
cout
<<a<<b<<c<<endl;
缓冲区:
|3|2|1|<-   (把“<-”看作是指针)
输出:
|3|2|<-     (输出 1)
     
 |3|<-       (输出 2)
     
 |<- (输出 3)
结果就是123.

 

在一开始的例子中,从右往左读入,先执行fun2(),输出num2,并将返回值2保存进缓冲区,再执行fun1(),输出num1,并将返回值1保存进缓冲区。最后开始读取缓冲区中的内容,输出1 2。

 

网上也有人质疑这种想法,但是这种想法很好的解释了出现的现象,暂且认为这是对的吧。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
矩阵连乘问题可以使用动态规划来解决,具体步骤如下: 1. 定义一个二维数组 dp[n][n],其中 dp[i][j] 表示从第 i 个矩阵到第 j 个矩阵的最小乘法次数。 2. 初始化 dp 数组的对角线元素为 0,即 dp[i][i] = 0。 3. 对于每个子问题 dp[i][j],枚举其中一个断点 k,将问题划分为两个子问题,即从第 i 个矩阵到第 k 个矩阵和从第 k+1 个矩阵到第 j 个矩阵。计算出这两个子问题的最小乘法次数,然后将它们相加,再加上这次乘法的代价(即两个矩阵的行数和列数的乘积),就得到了 dp[i][j] 的值。 4. 在计算 dp 数组的同时,记录下每个子问题的断点 k,以便后面输出矩阵的乘法次序。 5. 最终的最小乘法次数为 dp[1][n],同时根据记录的断点 k,可以输出出矩阵的乘法次序。 以下是 C++ 代码实现: ```cpp #include <iostream> #include <vector> using namespace std; void matrixChainOrder(const vector<int>& p, vector<vector<int>>& dp, vector<vector<int>>& s) { int n = p.size() - 1; dp.resize(n + 1, vector<int>(n + 1, 0)); s.resize(n + 1, vector<int>(n + 1, 0)); for (int len = 2; len <= n; ++len) { for (int i = 1; i <= n - len + 1; ++i) { int j = i + len - 1; dp[i][j] = INT_MAX; for (int k = i; k <= j - 1; ++k) { int q = dp[i][k] + dp[k + 1][j] + p[i - 1] * p[k] * p[j]; if (q < dp[i][j]) { dp[i][j] = q; s[i][j] = k; } } } } } void printOptimalParenthesis(const vector<vector<int>>& s, int i, int j) { if (i == j) { cout << "A" << i; } else { cout << "("; printOptimalParenthesis(s, i, s[i][j]); cout << "x"; printOptimalParenthesis(s, s[i][j] + 1, j); cout << ")"; } } int main() { vector<int> p = {30, 35, 15, 5, 10, 20, 25}; vector<vector<int>> dp, s; matrixChainOrder(p, dp, s); cout << "Minimum number of multiplications: " << dp[1][p.size() - 1] << endl; cout << "Optimal parenthesization: "; printOptimalParenthesis(s, 1, p.size() - 1); cout << endl; return 0; } ``` 这段代码实现了对于一个由 6 个矩阵构成的序列 {A1, A2, A3, A4, A5, A6},计算出其最小乘法次数以及最优的乘法次序。输出为: ``` Minimum number of multiplications: 15125 Optimal parenthesization: ((A1(A2A3))((A4A5)A6)) ``` 其中 ((A1(A2A3))((A4A5)A6)) 表示最优的乘法次序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值