现在的位置: 首页 > 综合 > 正文

C++易迷惑的基础知识(1)

2013年05月05日 ⁄ 综合 ⁄ 共 2518字 ⁄ 字号 评论关闭

重新过一遍C++,从基础知识开始,发现好多知识都是平时所不注意的,下边对其做一个总结。

1.包含头文件时,一般用<>包含编译器自带的库文件;而用" "包含自编文件。

    编译器会根据不同的包含符号分别到不同的路径中搜索要包含的文件。

2.如果包含头文件写成C风格的#include<iostream.h>会报错,那么说明当前用的是较新的编译器,

    报的是找不到文件的错误( fatal error C1083: 无法打开包括文件:“iostream.h”: No such file or directory),

    为了避免这种错误,要用C++风格的#include<iostream>。

3.C++语言中,主函数main的返回值默认为int型。所以要写上return 语句。

   例1:输出hello。

     #include<iostream>
int main()
{
std::cout<<"hello\n";
char c;
std::cin>>c;
return 0;
}

4.可以用printf来输出,但是就要包含stdio.h头文件,因为printf函数定义在那里。

   那么,cout<<"hello";中,不是cout相当于printf,而是<<(流插入运算符)相当于printf。

    相当于<<(cout,"hello");,<<相当于函数名,cout,"hello"是两个参数。

    cout是ostream类型,"hello"是C语言风格的字符串,是char*类型,而不是string类型。

    c语言中没有string类型,而C++语言中的string不是基础数据类型。

    char*类型的数据作为参数存放C语言风格的字符串"hello"的首地址。

    cin>>a;,输入流对象cin和流提取运算符>>,对象是标准输入流(键盘)输入的字符。

    输入流对象cin的数据类型是istream,

    同样可以把>>看成是一个函数名,cin,a看成两个参数。

    >>函数的返回值类型为istream。

5.在不写域名空间using namespace std;的情况下,若不是关键字,也不是用户自定义的标识符之前,

    要加入std::,写成std::cout<<"hello";,否则会有(error C2065: “cin”: 未声明的标识符)错误。

  例2:计算两个整数相加。

#include<iostream>
int main()
{
int a,b,sum;
std::cout<<"输入第一个整数\n";
std::cin>>a;
std::cout<<"输入第二个整数\n";
std::cin>>b;
sum = a + b;
std::cout<<"两个整数之和:"<<sum<<'\n';
char c;
std::cin>>c;
return 0;
}

6.上例中的  std::cout<<"两个整数之和:"<<sum<<'\n';这句话相当于:

    std::cout<<"两个整数之和:";

    std::cout<<sum;

    std::cout<<'\n';    

    可以看到如果<<看做函数的话,以上三句话的该函数的第二个参数类型是不同的,

    分别为char *,int ,char 类型,并且,这三句话调用的是三个不同的函数,称为函数重载。

    其实是流插入运算符,叫做运算符重载。

    C语言的Printf函数在格式化输出各种数据类型时使用的是同一个函数,C++使用输出流对象

    cout和流插入运算符<<输出时,使用了一组重载函数。

    那<<函数的返回值是什么呢?

    首先解释一下赋值语句,C语言中规定赋值表达式要返回表达式的左值。并且从右向左结合。

    计算int a,b,c=3; a=b=c;时,b=c=3,返回b,a=b=3。

    看这句话中,从左向右结合,先计算表达式std::cout<<"两个整数之和:",他的返回值与"<<sum"

    构成下一个要计算的表达式。所以std::cout<<"两个整数之和:"的返回值一定是输出流对象std::cout,

    不然不能与<<sum组成cout<<sum继续计算。

    因此,运算符<<看做函数时,返回值类型应该是cout的数据类型,为ostream.

7.cin与>>输入数据:

    默认情况下,C++使用空格符、制表符和换行符作为输入流中数据的分隔标志,并在提取过程中自动

    去除这些分隔符号,也就是说分隔符号不能作为数据的一部分。

    例3:使用cin和>>输入数据

#include<iostream>
int main()
{
char c;
int i;
double d;
std::cin>>c>>i>>d;
std::cout<<"c:"<<c<<std::endl<<"i:"<<i<<std::endl<<"d:"<<d<<std::endl;
return 0;
}

在输入过程中,可以尝试使用空格、回车、TAB键来分隔各个输入。

同理可验证,>>函数的返回值为istream类型。

输入过程中应该注意:

1.当输入过程中要注意输入数据与接受数据的变量类型的兼容性,否则会出现想不到的错误。

2.忽视空格符的分隔作用。

   主要表现在企图将空格符输入到字符变量中和企图将带有空格符的字符串保存在字符数组中。

    例4.输入时忽视空格符的分隔作用。

#include<iostream>
#include<string.h>
int main()
{
char c;
char str[20];
std::cin>>c;
std::cin>>str;
std::cout<<"c:"<<c<<std::endl;
std::cout<<"str:"<<str<<std::endl;
std::cout<<"str's len:"<<strlen(str)<<std::endl;
char x;
std::cin>>x;
int sw;
std::cin>>sw;
return 0;
}

输入内容:  Oh,My God!

输出:

c:O

str:h,My

str's len:4

    我们本来想让c:   (为空格)

    可是在提取输入流的过程中,空格符被自动去除。

    同样空格符被当做数据的分隔符,所以str从h字符开始提取,直到遇到字母y后面的空格符位置。  

抱歉!评论已关闭.