我有两个“等效”的 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”在执行函数之前打印第一部分?
先谢谢你了
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 代码完全相同。