C++ cout 打印顺序与 C printf 相比[重复]

问题描述 投票:0回答:2

我有两个“等效”的 C 和 C++ 程序,它们具有不同的输出。
他们应该逐步打印 0 到“exp”之间“base”的所有幂

test.c 是:

#include <stdio.h>  

int power(int b, int e) {  
    int p = 1;  
    for (int i = 0; i < e; i++) {  
        printf("%d^%d = %d\n", b, i, p);  
        p = p * b;  
    }  
    return p;  
}  

int main() {  
    int base = 2, exp = 3;  
    printf("%d^%d = %d\n", base, exp, power(base, exp));  
    return 0;  
}

输出:

2^0 = 1  
2^1 = 2  
2^2 = 4  
2^3 = 8  

test.cpp 是:

#include <iostream>  

using namespace std;  

int power(int b, int e) {  
    int p = 1;  
    for (int i = 0; i < e; i++) {  
        cout << b << "^" << i << " = " << p << endl;  
        p = p * b;  
    }  
    return p;  
}  

int main() {  
    int base = 2, exp = 3;  
    cout << base << "^" << exp << " = " << power(base, exp) << endl;  
    return 0;  
} 

输出:

2^3 = 2^0 = 1  
2^1 = 2  
2^2 = 4  
8  

谁能告诉我为什么会发生这种情况?
为什么“cout”在执行函数之前打印第一部分?
先谢谢你了

c++ c cout
2个回答
0
投票

cout
从左到右计算。当它看到它时,它只是打印它看到的所有内容。因此,在您的情况下,仅在打印该行的第一部分后才调用您的函数。

另一方面,

printf
需要评估所有内容来填充自身。因此,它首先运行您的函数,然后打印。

如果您想在 C++ 中获得此行为,最有意义的做法可能是将输出定义为字符串,填写输出,然后一次性打印出来,例如:

#include <iostream>

#include <sstream>

using namespace std;

int power(int b, int e) {
  int p = 1;
  for (int i = 0; i < e; i++) {
    cout << b << "^" << i << " = " << p << endl;
    p = p * b;
  }
  return p;
}

int main() {
  stringstream out;
  int base = 2, exp = 3;
  out << base << "^" << exp << " = " << power(base, exp);
  cout << out.str() << endl;
  return 0;
}

此代码的输出与 C 代码完全相同。


0
投票

这就是运算符

<<
的工作原理。第一个被评估,它返回对
std::cout
的引用,然后评估下一个运算符
<<
,依此类推。所以这段 C++ 代码相当于:

int main()
{
    int base = 2, exp = 3;
    cout << base; 
    cout << "^"; 
    cout << exp; 
    cout << " = "; 
    cout << power(base, exp); 
    cout << endl;

    return 0;
}

因此

main
在调用
power
之前打印一些内容,并在调用
power
之后打印一些内容。这里有一些工具扩展了 C/C++ 表达式,在一定程度上展示了这一点。

在 C 代码中,必须先评估所有参数,然后才能打印

main
,因此
power
必须在
main
中打印之前完成打印。

注意 C++23 引入了

std::print
,它是类型安全的
std::cout
,并且在这种情况下的行为类似于
printf

#include <print>

int power(int b, int e)
{
    int p = 1;
    for (int i = 0; i < e; i++) {
        std::print("{}^{} = {}\n", b, i, p);
        p = p * b;
    }
    return p;
}

int main()
{
    int base = 2, exp = 3;
    std::print("{}^{} = {}\n", base, exp, power(base, exp));
    return 0;
}

https://godbolt.org/z/vEeMP5nbP

© www.soinside.com 2019 - 2024. All rights reserved.