C++初始化列表的简单问题,求大神解答

#include<iostream>
int main()
{
using namespace std;
const int code = 66;
int x = 66;
char c1 {31324};
char c2 = {66};
char c3 {code};
char c4 = {x};
x = 31324;
char c5 = x;
cout << c1 << c2 << c3 << c4 << c5 << endl;
return 0;
}
问题一:
这段代码运行失败,原因是不是char c1 {31324};和char c3 {code};的问题?
这种格式允许吗?
还是说应该改为char c1 = {31324};和char c3 = {code};?

修改后 打印出的值为 \BBB\

问题二:
c1为什么打印出来的也是 \ ,用{}进行初始化应该是不允许缩窄的啊,为什么这里还可以运行

问题三:
c4为什么打印出来也是 B ,书上代码旁注释的是//not allowed ,x is not constant ,意思不就是不允许的意思吗,为什么还能运行?

问题四
书上还写着一段话——”在上述代码中,初始化c4时,您知道x的值为66,但在编译器看来,x是一个变量,其值可能很大。编译器不会跟踪下述阶段可能发生的情况:从x被初始化到它被用来初始化c4。“这段话不理解,求解释?

问题五:
为什么c1和c5 打印出来的值为 \ ??? 我只知道 \ 的ASCII码对应的十进制是 92。

#include<iostream>
int main()
{ using namespace std;
 const int code = 66;
 int x = 66; 
 char c1 (31324);
 char c2 (66);
 char c3 (code);
 char c4 (x);
 x = 31324;
 char c5(x);
 cout << c1 << c2 << c3 << c4 << c5 << endl;
 return 0;
}

运行结果为:\BBB\

以下一一解答你的问题:

    char c1 {31324};和char c3 {code};不能这样初始化,可以改成上面代码方式,也可改为你上面的赋值方式。

    因为C1=31324>256,所以编译器会把31324/256余数为92,那么C1=92了,打印的ASCII为\

    C4(x)的操作把x数值赋值给C4,只取X的低8位,66的ASCII为B,如果x>256那么操作像2中所述。

    “在上述代码中,初始化c4时,您知道x的值为66,但在编译器看来,x是一个变量,其值可能很大。编译器不会跟踪下述阶段可能发生的情况:从x被初始化到它被用来初始化c4。

    这里主要是不同的编译器原理不同而已,有的编译器是把x看成变量,就是编译时候x是不确定的数值,但是这里运行结构却不是如此,编译过程中已经给x分配数值。

    因为这里C1,C5都赋值为31424,详情见2中所述。

     

追问

const int code = 66;
int x = 66;
char c3 = {code};
char c4 = {x};
cout << c3 << c4 << endl;
输出的都是 B 这个字符。那是不是说有没有const都一样?
const是干什么用的??

追答

  解释一下const是常量符号,意思就是不能改变它的值,这里你是把code数值给别的变量,并未改变code的值,此处使用const没有必要的。
举个简单例子:
const ab=10;
ab=11;//此处编译器报错,不能修改const数值
cout<<ab;

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-16
1.不允许,没这种写法。
2.char只能存储一个字符。从内存来看,它只获得了31324(7A5C)的高位段 5C
3、4不太清楚怎么讲。应该是使用{}初始化,优先于=的初始化,所以对char c4 = {x};来说,x是未知的。如果不对,请大大指证。
5.参见2,5C转成十进制就是92,就是ASCII中的斜杠\
第2个回答  2013-07-16
问题一:
char c1 {31324};和char c3 {code};代码格式错误。会被编译器解释为函数定义。

应该改为char c1 = {31324};和char c3 = {code};这种格式,注意{ }内部只能有一个值。

问题二:
c1被初始化为31324,这个值是超过char类型的最大值的,当被作为char类型处理时,编译器会只取31324的低8位(char类型占8位)。31324的二进制为111101001011100,而低8位数转到10进制,就是92,也就是‘\'
问题三、四:
这个。。具体不清楚,不过,可能是c++与c语言的区别吧,比如c与c++对于定义数组时数组的大小这个问题,处理就是不一样的。
问题五:
同问题二了。追问

const int code = 66;
int x = 66;
char c3 = {code};
char c4 = {x};
cout << c3 << c4 << endl;
输出的都是 B 这个字符。那是不是说有没有const都一样?

追答

这个我也不能确定,毕竟没有这么写过,也没有了解到相应的参考。不过,我的理解是,这里给出const 和非const类型两种,意义就是想说明这个跟数组的定义、初始化是不一样的。
在定义数组的时候,长度必须是常量表达式,比如:char c6[code];这个是允许的,而,char c7[x];这个是不允许。个人觉得,它这么的写的意义就是区别这两种情况。

相似回答