C++学习之旅 第二章 printf与cout

目录

1.printf简介

 2.printf的四种用法

2.1 printf("字符串");

2.2 printf("输出控制符",输出参数);

2.3 printf("输出控制符1 输出控制符2  ,,,,,,,, ", 输出参数1, 输出参数2,....... );

2.4 printf("输出控制符 非输出控制符 ",输出参数);

3.printf为什么需要输出控制符

4.cout简介

cout的三种用法

5.1 std::cout

5.2 加上using namespace std;可不用在前面加上std::

5.3 在using namespace std; std后面加上::cout

 6.cout和i/i++/++i的组合使用

 7.iomanip库用法总结

8.结尾


1.printf简介

      printf函数是格式化输出函 ,数,一般用于向标准输出设备按规定格式输出信息。在C++中产生格式化输出的函数。其向终端输出字符。printf中的f的意思是format,它的作用是按照指定的格式输出数据。printf也是C++中很重要的一个函数,它能让用户可以与程序交流,是一个多才多艺的函数。                                                                                                                                                     printf 将变量的内容输出到显示器上。

 函数原型;                                     int     (    const   char  *  format,       ...   );

 2.printf的四种用法

2.1 printf("字符串");

这是我们最开始接触用法 hallo world就这种用法

#include
int main()
{
	printf("hallo world!\n");  //\n是换行
	return 0;
}

其中的hallo world可以用任意字符代替 比如THE WORLD 白金之星之类的

2.2 printf("输出控制符",输出参数);

#include
int main()
{
    int i = 5;
    printf("%d", i);  //d是十进制
    return 0;
}

假设这里我写的是5,也就是把5的二进制代码用十进制表示出来。所以在这里的 i 指的不是5而是5的二进制代码,不同的格式所表现的不一样,如

#include
int main()
{
    int i = 100;
    printf("%X", i);  //X是十六进制
    return 0;
}

  这里是把100的二进制代码用十六进制表现出来,结果是64,因此可以体现输出控制符的重要性。它决定了把二进制代码以什么形式输出的。

2.3 printf("输出控制符1 输出控制符2  ,,,,,,,, ", 输出参数1, 输出参数2,....... );

当然了这其中输出控制符1对应输出参数1,2对应2,依此类推。

#include
int main()
{
    int j = 6;
    int k = 9;
    printf("%d %d\n", j, k);
    return 0;
} 

  这里我们不能用一个%d表示两个参数,因为语法不是这样规定的(创始人这样规定的没办法)。同时输出控制符与输出参数的个数必须匹配,一一对应。

2.4 printf("输出控制符 非输出控制符 ",输出参数);

这里我们需要了解的是什么是输出控制符,什么是非输出控制符。作为初学者,我认为带%的大部分应该都是。比如 %d %f %x %c之类的。

#include
int main()
{
    int f =47;  //100是十进制
    printf("%x" ,f)         //输出结果是2f
    printf("%X" ,f)         //输出结果是2F
    printf("%#X" ,f);       //输出结果是0x2F
    printf("%#x" ,f);       //输出结果是0x2f
    return 0;
}

这里%#X的优势就体现出来了,有了0x可以体系这是十六进制。

     输出控制符包括如下

                                  %d        --    int

                                  %ld       --    long int

                                  %c        --    char

                                  %f         --    float

                                  %lf        --    double

                                  %x        --    int 或 long int 或 short int

                                  %o        --    同上

                                  %s        --    字符串

我们运用非输出控制符可以使程序更美观,比如这样:

#include
int main()
{
    int j = 6;
    int k = 9;
    printf("j = %d, k = %d\n", j, k);  //输出结果j = 6,k = 9
    return 0;
}

这么一看,这不漂亮多了,这样让人看得也很舒服明了!

然后,我给大家解释一下程序后面写的"\n"是什么意思,\n,就是换行一下,写\n可以让屏幕换一个行,接下来输出的都会在下一行!

3.printf为什么需要输出控制符

  

首先,01组成的代码可以表示数据也可以表示指令,打个比方,010101010111000这一串它表示的是一个数字还是一个字符还是一个电影或图片,这我们无法知道。这01本身没有含义,取决我们如何来解读。所以必须要有有输出控制符来解读,要不然谁知道这是啥意思。

其次,如果01组成的代码表示的是数据的话,那么同样的01代码以不同的格式输出就会有不同的输出结果。所以我们就需要一个输出控制符。


4.cout简介

  cout 是C++中 ostream 类型的对象,该类被封装在 < iostream > 库中,该库定义的名字都在命名空间 std 中,所以 cout 全称是 std::cout 。

  在cout这个类里面,有着非常重要的函数,可以用里面的函数输出(由于是新手篇,这里就不多讲了),还有一个,而已cout<<数字/字符串;大家可能不知道,"<<"是左移运算符的意思,作用是将一个二进制数的值左移一位,但是在cout上面意思就不好说通了,如果是数字那还好说,但是是字符串的话,怎么转化为二进制,怎么左移?

  所以这个<<并不是左移运算符的意思,在这里,我给大家普及一下知识:这是运算符重载,重载是什么意思呢?就是一个函数,名称相同,类型相同,但是里面的参数不相同,编译器是允许运行的,这就形成了重载关系,在这个otream类里面,将<<运算符重载了一遍,这样就可以进行输出了(新手篇,具体内容不细讲).

如果大家想要了解运算符重载的知识,可以看一下我的这篇文章:

C++运算符重载总结_龙星尘的博客-CSDN博客一定要自定义一个拷贝构造函数,这样在重载运算符返回对象副本的时候,编译器会自动调用拷贝构造函数,否则会出现结果错误。把‘=’运算符重载为类成员变量,并且将返回值设计成为该类的引用。除了‘=’运算符以外,其他的运算符重载最好设计成为友元函数。这就是我们今天要讲的运算符重载的总结.友元关系不会被派生类继承。https://blog.csdn.net/wo_ai_luo_/article/details/127791616

cout的三种用法

前提:如果程序中想使用 cout ,需要包含库 < iostream > 。

5.1 std::cout

因为 cout 是 std 库中的一个类的对象,所以使用的方法是 std::cout ,如下:

#include 
int main(){
	int i;
	std::cin >> i;
	std::cout << i << std::endl;
	return 0;
}

这样子比较麻烦,所有的都要加std::,个人建议不要这种输出.

5.2 加上using namespace std;可不用在前面加上std::

  在C++里面,有一个std的命名空间,使用了之后,就方便很多了,不用在前面加上std::了!

使用 std 命名空间:

#include 
using namespace std;
int main(){
	int i;
	cin >> i;
	cout << i << endl;
	return 0;
}

这样,后面程序中可以直接使用 cout ,而且std中的其他名字也可以直接使用,如 cin 、 endl 等。

5.3 在using namespace std; std后面加上::cout

#include 
using namespace std::cout;
int main(){
	int i;
	std::cin >> i;
	cout << i << std::endl;
	return 0;
}

这样,后面程序中只可以直接使用 cout ,而 std 中的其他名字不可以可以直接使用(这种方式一般情况下不建议使用,但是有些题很特殊,可能需要这样来办)。

 6.cout和i/i++/++i的组合使用

i++ 和 ++i 是有着不同的含义,和 cout 组合使用也会得到不同的结果,下面给出一段代码:

#include 
using namespace std;
int main(){
	int i = 1;
	cout << ++i << i++ << i << i++ << ++i << endl;
	return 0;
}

这段代码的结果是多少呢?
A.23345
B.22335
C.54535
D.53525

我们不妨先理解一下 cout 输出控制台的过程。看下面这幅图:

根据表达式来看, endl 会作为一个可以供 cout 接收的对象往前传,而 ++i 和 endl 结合起来作为一个可以供 cout 接收的对象往前传,依次递推下去。物理实现上需要一个栈来保存可以供 cout 接收的对象,然后从右向左放到这个栈里,然后依次弹出输出在屏幕上。其中, i 和 ++i 会在栈里面保存 i 的引用,而 i++ 会在栈里面保存数字,过程如下:

第一步:将 endl 压入栈中, i 值不变;
第二步:将 i 的引用压入栈中, i 的值加 1 变成 2(因为是 ++i );
第三步:将 2 压入栈中, i 的值加 1 变成 3(因为是 i++ );
第四步:将 i 的引用压入栈中, i 的值不变(因为是 i );
第五步:将 3 压入栈中, i 的值加 1 变成 4(因为是 i++ );
第六步:将 i 的引用压入栈中, i 的值加 1 变成 5(因为是 ++i );
第七步:将栈里的数据依次弹出,即可得到 53525 。(因为i的值是 5 ,所以所有 i 的引用都是 5 )

 7.iomanip库用法总结

iomanip是cout里面的头文件库,给大家讲一下:

< iomanip > 库封装了很多对输入输出流的操作,常见用法总结如下:

控制符    作用
setbase(n)    以n进制方式输出(n=8,10,16)
setfill(ch)    设置字符填充,ch可以是字符常量或字符变量
setprecision(n)    设置输出有效位数为n位
setw(n)    设置字符宽度为n位,只对后一个有影响
setiosflags(ios::uppercase)    以大写字母显示
setiosflags(ios::fixed)    实现对小数点后的数字的控制
setiosflags(ios::scientific)    以科学计数法显示
setiosflags(ios::showpoint)    强制显示小数点
setiosflags(ios::showpos)    强制显示正号
setiosflags(ios::left)    设置输出左对齐
setiosflags(ios::right)    设置输出右对齐
resetiosflags(…)    终止括号中的输出格式

8.结尾

  第6点和第7点比较难理解,里面设计到了C++的高级数据结构栈,已经各种库函数,在新手篇里面做一个普及的作用.

最后,感谢大家的观看!

你可能感兴趣的:(C++学习之旅,c++,学习,cout,printf,进制)