C printf与C++ cout输出顺序差异原因咨询
C与C++幂值打印程序的输出差异原因
我编写了两个逻辑看似等价的C和C++程序,用于逐步打印底数base从0到指数exp的幂值,但二者输出结果不同。
C程序(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; }
C程序输出
2^0 = 1 2^1 = 2 2^2 = 4 2^3 = 8
C++程序(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; }
C++程序输出
2^3 = 2^0 = 1 2^1 = 2 2^2 = 4 8
差异原因解析
C程序的执行逻辑
C语言里,printf是普通函数调用,虽然标准没有强制规定参数的求值顺序,但绝大多数编译器会采用从右往左的求值规则。也就是说,main中的printf会先执行最右侧的power(base, exp):
power函数内部循环先打印出2^0=1、2^1=2、2^2=4,最后返回计算结果8。- 之后才把
base、exp和返回值8代入printf,打印最后一行2^3=8,最终输出连续且符合预期。
C++程序的执行逻辑
C++的cout使用的是重载的<<运算符,这是一条表达式链,而非普通函数调用:
cout << base << "^" << exp << " = " << power(base, exp) << endl;
在C++17标准之前,表达式中各个操作数的求值顺序是未指定的——编译器可以自由选择求值顺序。你的编译器恰好先处理了左侧的base << "^" << exp << " = ",直接输出了2^3 = ,之后才调用power(base, exp):
power函数内部循环依次打印2^0=1、2^1=2、2^2=4。- 最后
power返回的8被cout输出在最后一行,导致输出内容混乱拼接。
如果使用C++17及之后版本的编译器,标准明确规定了<<运算符的操作数必须从左到右求值,就不会出现这种问题了。
内容的提问来源于stack exchange,提问作者Francesco Antropoli
相关产品推荐
相关产品推荐

