#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;
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];这个是不允许。个人觉得,它这么的写的意义就是区别这两种情况。