• C++ Primer笔记001:标准输入输出/基本数据/流程控制语句


    1.标准输入cin:

    cin对象是标准输入流,对象类型是istream,与输入运算符(>>)一起使用,>>左边是一个istream对象,右侧是写入对象。

    >>从给定的istream中读取输入,并存入输入写入对象中。

    2.标准输入cout:

    cout是标准输出流,对象类型是ostream,与输出运算符(<<)一起使用,<<左边是一个ostream对象,右侧是输入对象。

    <<从将输入对象写入到给定的ostream对象中。

    3.endl:

    endl的效果是将缓冲区的数据写入到文件或者设备中并换行,endl的效果等价于'\n' + std::flush

    4.命名空间(namespace):

    命名空间的作用是避免名字冲突,使用命名空间中的对象是,要加作用域运算符::,或者直接加using namespace 命名空间的名字

    示例程序:

    void iotest()
    {
    	int a,b;
    	std::cin >> a >> b;//从cin中读取数据,写入到变量a,b中,使用cin要加命名空间和作用域运算符
    	std::cout << a <<std::endl<< b<<'\n' << std::flush;//将a,b中的数据依次写入到标准输入中
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行结果:

    前两个数字1和4是从键盘输入的数字,后两个数字是把a b的值写入到标准输入流中,然后显示出来

    不加命名空间和作用域运算符的写法

    using namespace std;
    void iotest()
    {
    	int a,b;
    	cin >> a >> b;
    	cout << a <<endl<< b<<'\n' << flush;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    效果同上

    一般实际写代码的时候,采用不加命名空间和作用域运算符的写法,因为自己构建的命名空间一般不会和std中的名字冲突

    cin和其他的istream对象还可以用于条件判断

    void cinwhiletest()
    {
    	int a,sum=0;
    	while(cin>>a) {
    		sum+=a;
    		cout<<"sum is "<<sum<<endl;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    当输入的a值不为int时(输入非int值或者文件结束符),条件判断为false,退出循环,Ubuntu下按下CTRL+D为文件结束符

    5.有符号类型和无符号类型

    当有符号类型的数据和无符号的类型的数据混用时,会把表达的最终结果转化为无符号数据,然后输出

    void signedunsigned()
    {
    	int a=-11;
    	unsigned b=10,c=12;
    	cout<<a+b<<endl;
    	cout<<b-c<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    a+b结果不是-1,而是4294967295,表明将-1转化为unsigned,结果是4294967295

    b-c的结果不是-2,而是4294967294,由于-2不在unsigned的范围内,所以结果是4294967294

    所以,不要混用无符号数据和有符号数据,以及不要用无符号数据来判断是否小于零

    6.字面值常量

    字面值常量的值一望而知,比如 20, 023, 0x29, ‘a’, “str”…

    7.变量的初始化和赋值

    初始化的含义是创建一个变量并给该变量一个初始值。
    而赋值是把变量中原来的值擦除,用一个新的值替换

     int a=0;//初始化,创建a,并给a一个初始值 
     a=1//赋值,用1替换0
    
    • 1
    • 2

    对C++来说,基本内置类型(int float double char bool …)的初始化和赋值差别不大,但是对于非基本内置类型和自己定义的类来说,初始化和赋值是两个完全不同的操作。

    C++中还有一种初始化叫默认初始化(只创建一个变量或者对象,但是不初始化)

    void defaultinit()
    {
    	int a;
    	float b;
    	cout << a <<endl<<b<<endl;
    	string s;
    	cout<<s<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    对于基本内置类型来说,这种操作会产生无效数据(垃圾值),所以,对于内置基本类型,不要默认初始化

    对于非内置基本类型和自己定义的类,可以使用默认初始化,因为类的初始值会由构造函数来决定,所以string产生了空串。

    8.变量的作用域

    当变量名相同时,C++会向上查找,就近选择变量名,下面代码仅用来说明,实际编程时,要避免变量名重复

    int a=50
    void testscope()
    {
    	cout<<a<<endl;//此时a向上查找,发现最近的a是50
    	int a=0;//覆盖全局a
    	cout<<a<<endl<<::a<<endl;//第一个a向上查找,发现最近的a是0,如果想访问全局a,要加作用域符号
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    从结果来看,变量的作用域(有效范围)总是就近的,就近的同名变量作用域会覆盖远的同名变量的作用域

    9 求余运算符的符号

    m%n,符号和m一致

    void getremainder()
    {
    	cout<<5%3<<endl<<5%-3<<
    	endl<<-5%3<<endl<<-5%-3<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    10.关于sizeof

    sizeof用来返回字节所占空间的大小,但是并不计算对象的实际值,所以sizeof的对象可以无效(比如是一个空指针)

    void testsizeof()
    {
    	cout<<sizeof(nullptr)<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4

    另外,可以用sizeof来计算数组的长度

    void testsizeof()
    {
    	int nums[20]={0};
    	cout<<sizeof(nums)/sizeof(*nums)<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    11.switch case语句漏写break

    switch case语句的执行机制就是当匹配到任何一个case后,顺序执行后续所有的代码,除非添加break中断。

    所以,在switch case语句漏写break会产生逻辑错误

    
    ```cpp
      void nobreakinswitchcase()
        {
        	char c;
        	cin>>c;
        	int a=0,e=0,i=0,o=0,u=0,d=0;
        	switch(c) {
        		case 'a':
        		++a;
        		case 'e':
        		++e;
        		case 'i':
        		++i;
        		case 'o':
        		++o;
        		case 'u':
        		++u;
        		default:
        		++d;
        	}
        	cout<<a<<","<<e<<","<<i<<","<<o<<","
        	<<u<<","<<d<<endl;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    通过上述结果,可以发现,在匹配到对应的case后,代码会顺序执行后面所有的代码,所以,要在switch case语句中的每个条件执行完后,添加break语句

  • 相关阅读:
    UE4运用C++和框架开发坦克大战教程笔记(十九)(第58~60集)完结
    Android学习从入门到放弃(文末有福利)
    智慧楼宇联网智能门锁解决方案
    第三章、组织代码
    VS Code:CMake配置
    用 Python 为接口测试自动生成用例
    C# TCP Server服务端多线程监听RFID读卡器客户端上传的读卡数据
    Python实现天文计算
    【Vue项目复习笔记】详情页的展示
    [附源码]SSM计算机毕业设计网上书店管理系统JAVA
  • 原文地址:https://blog.csdn.net/jiangchufeng123/article/details/133941080