C++ char*p#c=新char[';1';,';2';,';3';,';4';]的含义;

C++ char*p#c=新char[';1';,';2';,';3';,';4';]的含义;,c++,C++,考虑 char*p_c=新字符['1','2','3','4'] 这个语法正确吗?如果是,那么它是做什么的 我不知道为什么,但编译器允许这种语法!它对记忆有什么影响?我无法通过*p\u c访问变量。如何确定元素的大小和元素的数量?< p>你的代码是语法上有效的C++,如果很奇怪,我认为它没有你想要的: newchar['1'、'2'、'3'、'4']根据逗号运算符的工作方式计算为newchar['4']。(前面的元素从左到右求值,但表达式的值是最右边的元素的值。) 所以你的语句相当于char*p

考虑

char*p_c=新字符['1','2','3','4']

这个语法正确吗?如果是,那么它是做什么的


我不知道为什么,但编译器允许这种语法!它对记忆有什么影响?我无法通过
*p\u c
访问变量。如何确定元素的大小和元素的数量?

< p>你的代码是语法上有效的C++,如果很奇怪,我认为它没有你想要的:

newchar['1'、'2'、'3'、'4']
根据逗号运算符的工作方式计算为
newchar['4']
。(前面的元素从左到右求值,但表达式的值是最右边的元素的值。)

所以你的语句相当于
char*p_c=newchar['4']

'4'
是一种
char
类型,其数值取决于平台使用的编码(ASCII、EBCDIC和c。尽管前者最有可能在桌面系统上)

因此,当转换为
大小时,数组中的元素数等于
'4'
计算的值。在ASCII系统上,元素的数量为52

char *p_c = new char['1', '2', '3', '4'];
在功能上等同于:

char *p_c = new char['4'];
char* p_c = new char['4'];
因为。逗号运算符从左到右计算其运算符,并丢弃除最后一个(最右边的一个)之外的其他运算符

字符文字<代码> '4' 在ASCII中有52值(但您的系统不必使用ASCII,C或C++标准也不需要它,但几乎所有的现代系统都使用ASCII)。 所以,就好像你用了:

char *p_c = new char[52];
您使用的新表达式的语法如下所示:

identifier = new Type[<expression>];
它将计算逗号列表中的每一项并返回最后一项,即
'4'
,结果将转换为其
std::size\t
值,可能(
52
);因此,该代码相当于:

char *p_c = new char['4'];
char* p_c = new char['4'];

请仔细阅读有关逗号运算符的内容-感谢您的快速回复。请注意,“4”的计算结果必须为正数。(它是基本执行集中的一个字符。)因此,无论发生什么,该表达式都是合法的。(其他字符可能是负数,因此在运行时会产生错误。)它可能会在顶部附近放置类似“但它几乎肯定不会做您希望它做的事情”的内容。@MartinBonner:这很有帮助。在采用EBCDIC编码的系统上,
char
大概必须始终是
无符号的
类型。否则
'4'
(具有无符号值244)将为负值,因此将转换为非常大的
大小@MartinBonner负索引不一定产生错误,它将被转换为
size\u t
,并分配大量内存(是否成功当然取决于系统细节),也许他的意思是
新字符[4]{'1','2','3','4'}