C++输出流 cout 相关问题

我们先来看下面的代码,想一想它的输出

#include <iostream>
using namespace std;

int g = 0;
template<typename T>
int foo()
{
	int value = ++g;
	return value;
}

int main()
{
	//Qs1
	int a = 1;
	//cout << a << " " << ++a << " " << a++ << endl;	
	cout << a << " " << a++ << " " << ++a << endl;		
	
	//Qs2
	int one = 1;
	int *b = &one;
	cout << *b << " " << ++(*b) << " " << (*b)++ << endl;		
	//cout << *b << " " << (*b)++  << " " << ++(*b) << endl;	

	//Qs3
	cout << foo<int>() << " " << foo<char>() << " " << foo<float>() << " " << foo<double>() << endl;

	return 0;
}

输出结果: 

ubuntu18.04 下的结果:

root@lui-pc:~/CLionProjects/test01# g++ -std=c++11 main.cpp
root@lui-pc:~/CLionProjects/test01# ./a.out 
1 1 3
root@lui-pc:~/CLionProjects/test01# cat main.cpp
#include <iostream>
using namespace std;
int main()
{
    int a = 1;
    cout << a << " " << a++ << " " << ++a << endl;
}

我们注意这条语句:cout << a << " " << ++a << " " << a++ << endl;(求值顺序

呈现的规律(注意项):

  • 计算顺序:自右至左
  • 输出顺序:自左至右
  • std::cout<< a++:输出的是a++的值,而不是a的值
  • 一条表达式语句中对同一个变量使用多次副作用语法(题目中的前缀自增和后缀自增)是未定义行为,输出什么都不算错。关于表达式的求值顺序请参考:求值顺序

原因解释:

  • 很多的编译器在函数调用的时候,会在内存中分配一个函数调用栈,函数的参数总是从右往左的顺序计算并进栈。
  • 关于更多未定义行为的错误或者未定义行为的危险查看John Regehr的博客

John在文章中总结了要遵循的规则:

  • 启用并注意编译器警告,最好使用多个编译器
  • 使用静态分析仪(如Clang,Coverity等)可以获得更多警告
  • 使用编译器支持的动态检查; 例如,gcc的-ftrapv标志生成用于捕获有符号整数溢出的代码
  • 使用像Valgrind这样的工具来获得额外的动态检查
  • 当函数是上面分类的“类型2”时,记录它们的前置条件和后置条件
  • 使用断言来验证函数的前置条件是否实际上是后置条件
  • 特别是在C ++中,使用高质量的数据结构库

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值