c++cout执行顺序之一个不容易注意到的一点

二话不说,先看一个例子

#include <iostream>

using namespace std;

int main()
{
    int a[10]={1,12,34,56,78,89,90,8,9,0};
    int *p=a;
    int *p2=a;
    cout<<++*p<<endl;
    cout<<*++p<<endl;//谁靠的近先执行谁
    cout<<endl;
    cout<<++*p2<<"    "<<*p2<<"    "<<*++p2<<endl;
    char *st[]={"asd","qwe","zxc"};
    char**q=st;
    cout<<*++q<<endl;
    cout<<*q<<endl;
    return 0;
}

运行结果

2
12

13    12    12
qwe
qwe

是不是很interesting,本来是探究++与解指针运算符*的优先级的问题,引发了一个有关cout执行顺序的问题。
其实这两的优先级一样都为2

为什么p2的输出就成了这个样子,而并不是我们所认为的2    2    12.

种种事实表明,cout的运行时候执行顺序是从右往左,是符合栈的执行模型的。再来个例子

#include <iostream>

using namespace std;

int  f1()
{
    cout<<"f1"<<endl;
    return 1;
}
int  f2()
{
    cout<<"f2"<<endl;
    return 2;
}
int  f3()
{
    cout<<"f3"<<endl;
    return 3;
}

int main()
{
    cout <<"first--"<<f1()<<"   second--"<<f2()<<"   third--"<<f3()<< endl;
    return 0;
}

可以看到运行结果为

f3
f2
f1
first--1   second--2   third--3

Process returned 0 (0x0)   execution time : -0.000 s
Press any key to continue.

这明显证明cout在执行的时候为从右向左先执行,然后在输出的时候为按照原来的顺序在从左像右的输出

时间: 2024-11-13 09:48:07

c++cout执行顺序之一个不容易注意到的一点的相关文章

C++ cout执行顺序

C++ cout执行顺序 问题描述是这样的:如果在cout中调用函数,同时这个函数中包含输出语句,那么会先输出哪一句? 仔细一看,突然发现对C++的内容遗忘了,确实一下子看不出来输出的先后问题. 实现如下: 1 int max(int x, int y) 2 3 { 4 5 int max=0; 6 7 max=(x>y)?x:y; 8 9 cout<<"2. max="<<max<<endl; 10 11 return max; 12 13

cout 计算顺序问题

cout输出流的执行顺序 下面是IBM的一道笔试题 #include <iostream> using namespace std; int fun( ) { cout << "f" ; return 1; } int main() { int i = 1; // cout << i++ << i++ << i++ << endl; cout << "m" << fun(

继承构造函数的执行顺序

转自:http://blog.csdn.net/daheiantian/article/details/6438782 Code: #include <iostream> using namespace std; class A { public: A() { cout<<"int A::A()"<<endl; } A(A &a) { cout<<"int A::A(A &a)"<<endl

C++中多重继承构造函数执行顺序

代码1: 1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std; 5 6 class A{ 7 public: 8 A(){ 9 cout<<"A"<<endl; 10 } 11 }; 12 class B{ 13 public: 14 B(){ 15 cout<<"B"<<endl; 16 } 17 }; 18 cl

C++多重继承的构造执行顺序

一个类,它可能有基类,也可能存在多个基类,这些类里面还可能是虚拟基类,并且在类的本身也可能存在对象成员.那么所涉及的这些类或对象成员会以什么样的顺序来调用它们各自的构造函数呢?今天我们就来举例分析下. 执行以下程序: #include <iostream> using namespace std; class Base{ public: Base(){ cout << "The constructor of Base" << endl; } }; c

iOS程序执行顺序和UIViewController 的生命周期(整理)

说明:此文是自己的总结笔记,主要参考: iOS程序的启动执行顺序 AppDelegate 及 UIViewController 的生命周期 UIView的生命周期 言叶之庭.jpeg 一. iOS程序的启动执行顺序 程序启动顺序图 iOS启动原理图.png 具体执行流程 程序入口进入main函数,设置AppDelegate称为函数的代理 程序完成加载[AppDelegate application:didFinishLaunchingWithOptions:] 创建window窗口 程序被激活[

修饰符-包-内部类-代码块执行顺序

1.访问权限修饰符     从大到小的顺序为:public--protected--default--private     private--只能在同一类中使用;     default--不用写出来,默认不加.可以被同一包中的类使用     protected--可以被不同包的子类使用     public--可以被不同包的其它类使用 2.各种修饰符的修饰对象(可修饰哪些:类/接口/方法/属性)(多个修饰符连用是可以没有顺序的!)     1)访问权限修饰符:public/default--

NAT与ACL执行顺序解析

防火墙数据包处理流程图 ACL与NAT的顺序不是固定的,各厂商数据流先ACL或先NAT不一. 引用<浅析ACL与NAT的执行顺序>-张少芳  一文中的结论如下: H3C 出站:先匹配出站ACL,然后进行地址转换 入站:先进行地址转换,然后匹配入站ACL CISCO 出站:先进行地址转换,然后匹配出站ACL 入站:先匹配入站ACL,然后进行地址转换(即上图所示数据流顺序) 结论 H3C设备和CISCO设备在对ACL与NAT的执行顺序处理上完全相反.由于在实际的网络中可能存在来自不同厂商的设备,因

Java(静态)变量和(静态)代码块的执行顺序

本文讨论Java中(静态)变量.(静态)代码块的执行顺序 首先创建3个类: 1.Foo类,用于打印变量 public class Foo { public Foo(String word) { System.out.println(word); } } 2.Parent类 public class Parent { static Foo FOO = new Foo("Parent's static parameter"); Foo foo = new Foo("Parent'