与字符常量与字符串常量相关的编译错误
字符常量是用单引号' 括起来的一个字符,如普通字符常量 'a' '$' 等、有某些控制作用的字符常量'\n' '\r' '\a' 等转义字符、用3位八进制数表示的转义字符 '\101' 、用2位16进制数表示的转义字符'\x41' 等。
只要是字符常量(不管是普通的,还是转义的),都要用单引号进行界定,除了转义字符字符,普通字符常量在单引号中只能有一个字符。 转义字符常量必须用单引号进行界定,并且单引号内的第一个字符必须是“\”来表示其是转义字符。
以下是关于字符常量和字符串常量中常见的相关错误:
(1)在书写普通字符常量时,如果单引号内出现多个字符,编译时会出现以下错误:
error C2015: too many characters in constant //字符常量中的字符太多
以下是错误案例
#include <iostream>
using namespace std;
int main()
{
cout<<'abcdefg'<<endl;
return 0;
}
编译后如图
修改后代码
#include <iostream>
using namespace std;
int main()
{
cout<<'a'<<'b'<<'c'<<'d'<<'e'<<'f'<<'g'<<endl;
return 0;
}
错误分析:
单引号表示字符型常量。一般的,单引号中必须有,也只能有一个字符(使用转义符时,转义符所表示的字符当作一个字符看待),如果单引号中的字符数多于4个,就会引发这个错误。
另外,如果语句中某个字符常量缺少右边的单引号,也会引发这个错误,例如:
if (x == 'x || x == 'y') { … }
值得注意的是,如果单引号中的字符数是2-4个,编译不报错,输出结果是这几个字母的ASCii码作为一个整数(int,4B)整体看待的数字。
例如
#include <iostream>
using namespace std;
int main()
{
cout<<'abcd'<<endl;
return 0;
}
编译不出错,运行结果如下
运行结果并不是我们期待的abcd,要想输出abcd,可以修改程序
#include <iostream>
using namespace std;
int main()
{
cout<<"abcd"<<endl;
return 0;
}
或
#include <iostream>
using namespace std;
int main()
{
cout<<'a'<<'b'<<'c'<<'d'<<endl;
return 0;
}
(2)在书写普通字符常量时,如果单引号内出现0个字符,即单引号内没有任何内容,如'',尤其是输出空格字符时' '时,有时会错误书写成'',编译时会出现以下错误:
error C2137: empty character constant //空字符常量,即字符常量中没有内容
以下是错误案例
#include <iostream>
using namespace std;
int main()
{
cout<<'a'<<''<<'b'<<endl;
return 0;
}
修改后程序,在''中加一个空格,变为' '
#include <iostream>
using namespace std;
int main()
{
cout<<'a'<<''<<'b'<<endl;
return 0;
}
(3)如果在书写时,作为字符常量界定的单引号要成对出现,若不成对,编译一定会报错。
经常会出现以下错误:error C2001: newline in constant //表示在常量中出现了换行
还经常伴随错误:error C2015: too many characters in constant //字符常量中的字符太多
以下是错误案例-字符常量错误
#include <iostream>
using namespace std;
int main()
{
cout<<'a'<<'b'<<'c<<endl;
return 0;
}
作为字符串常量界定的双引号也要成对出现,若不成对,编译一定会报错。
经常会出现以下错误:error C2001: newline in constant //表示在常量中出现了换行
以下是错误案例-字符串常量错误
#include <iostream>
using namespace std;
int main()
{
cout<<"abc<<endl;
return 0;
}
编译时出错如下图
错误 error C2001: newline in constant //表示在常量中出现了换行 的分析:
(1)字符串常量、字符常量中是否有换行。
(2)在这句语句中,某个字符串常量的尾部是否漏掉了双引号。
(3)在这语句中,某个字符串常量中是否出现了双引号字符“"”,但是没有使用转义符“\"”。
(4)在这句语句中,某个字符常量的尾部是否漏掉了单引号。
(5)是否在某句语句的尾部,或语句的中间误输入了一个单引号或双引号。