讨论printf和cout的参数调用顺序

这里纠正在网络上看到的几个错误,以下给出正确的观点:

(1)printf和cout都是有缓冲机制的。(有人认为printf是没有缓冲区的)

(2)printf和cout函数对参数的调用顺序在c/c++中是未定义的。(有人认为它们读入的顺序是由右向左,输出顺序是由左到右,类似于栈)

基于以上错误的认识,看下列程序,有人会得到错误的输出的结果。

#include <stdio.h>
#include <iostream>
using namespace std;

int main() {
	int value, value2;

        //A
	int a = 3;
	printf("printf a: %d  %d\n", a++, a++);
	cout << "after a: " << a << endl << endl;

        //B
        int d = 3;
	cout << "cout d: " << d++ << " " << d++ << endl;
	cout << "after d: "  << d << endl << endl;

        //C
	int c = 3;
	printf("printf c: %d  %d\n", c++, ++c);
	cout << "after c: " << c << endl << endl;

        //D
        int b = 3;
	cout << "cout b: " << b++ << " " << ++b << endl;
	cout << "after b: " << b << endl << endl;

        //E 该部分代码是<span style="color:#3366FF;">《程序员面试宝典第四版32页》的题</span>
	int arr[] = {6,7,8,9,10};
	int *ptr = arr;
	*(ptr++) += 123;
	printf("%d, %d\n", *(ptr++), *(++ptr));
        //cout << *(ptr++) << " " << *(++ptr) << endl;
 }

以上程序在Visual studio 2010中的运行结果如下图:

但是在g++下的运行结果如下图:

因此可以看出,printf和cout对参数的调用顺序是根据编译器而定的,在C/C++标准中并没有规定这两者对参数的调用次序。上述输出的不同跟缓冲区毫无关系。

但注意在代码中E部分的代码(该部分代码是《程序员面试宝典第四版32页》的题)中,printf在两个编译器下的执行结果是一样的。但是如果使用cout输出的话(如代码的最后一行注释),则在vs2010下的执行结果是"8 9",而在g++下的执行结果是”10 10“。

这部分内容搞得很混乱,求大神指教。

时间: 2024-10-26 07:08:36

讨论printf和cout的参数调用顺序的相关文章

c语言中printf()函数中的参数计算顺序

今天看到了一个关于printf()函数计算顺序的问题,首先看一个例子: #include<stdio.h> int main() { printf("%d---%d---%d",printf("ab"),printf("c"),printf("eee")); } 输出结果为: 这说明printf()函数在计算的时候顺序是从右往左的,但最后输出的顺序是从左往右的.所以遇到类似题目时,应该根据运算顺序和输出顺序灵活判断

C++C++中构造函数与析构函数的调用顺序

http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2: 构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 参考3: C++构造函数与析构函数的调用顺序 2.构造函数.析构函数与拷贝构造函数介绍 2.1构造函数 构造函数不能有返回值 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 创建一个对象

C++类构造析构调用顺序训练(复习专用)

//对象做函数参数 //1 研究拷贝构造 //2 研究构造函数,析构函数的调用顺序 //总结 构造和析构的调用顺序 #include "iostream" using namespace std; class ABCD { //this() public: ABCD(int a, int b, int c) { this->a = a; this->b = b; this->c = c; printf("ABCD() construct, a:%d,b:%d

(struct)结构体变量作为函数参数调用的方法小结

结构体变量.结构指针变量.结构数组作为函数的参数应用实例分析 struct stud { long int num; float score; }; /*结构体变量作为函数的参数,修改之后的成员值不能返回到主调函数*/ void funvr(struct stud t) { t.num=2000101; t.score=71.0; } /*结构体数组作为函数的参数,修改后的元素的成员值能返回到主调函数*/ void funar(struct stud t[]) //void funar(stru

【C/C++】构造函数与析构函数的调用顺序

常见问题 Q1. 以下代码的输出结果是什么? 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { cout << "A" << endl; } 8 ~A() { cout << "~A" << endl; } 9 }; 10 class B : public A 11 { 12 public: 13 B

C++:派生类的构造函数和析构函数的调用顺序

一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: ? 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. ? 改造基类函数:在派生类中声明一个或多个与其(某个)基类中的成员函数同名的成员函数,并将它(们)根据新的需求进行重写 ? 发展新的成员:在派生类中添加新的成员变量和成员函数,其中新添加的成员要求必须和基类中的成员不同名,并且应当保证新添加的成员会使派生类在功能上相比其基类有所发展 ? 重写派生类的构造函数和析构函数

继承中参数传递及调用顺序

一.简单派生类的构造函数传参 C++语言的继承特性,指子类可以继承父类的属性和行为,并可以重新定义或添加新的属性和行为.父类中为private型的属性和行为虽然被继承,但是子类中仍不能访问.在继承机制下,构造函数是不能被继承的,所以基类构造函数的参数要由子类构造函数传! 单一继承的子类构造函数的声明(.h中)形式为: 派生类构造函数名(参数总表) (); 单一继承的子类构造函数的定义(.cpp中)形式为: 派生类名::派生类构造函数名(参数总表) : 基类构造函数名 (参数名表) { 派生类新增

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }

Activity生命周期方法的调用顺序工程与测试日志

下面为测试activity的方法的执行顺序   工程与测试资源地址 android工程 AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.finalizetest"