请给出详细解释,谢谢先
首先谢谢的回答,但是还是有些模糊。
我看楼下有兄弟说sizeof(“abcdefg”+'2' +‘2’)的值为4,不知道是否正确,如果是的话,对sizeof的理解就更麻烦了啊,是否有sizeof的标准文档来说明编译器的处理方式呢,谢谢。
请问sizeof("abcdefg"+'2')的值是多少
答案:6 悬赏:80
解决时间 2021-12-14 16:28
- 提问者网友:久伴不朽
- 2021-12-14 01:51
最佳答案
- 二级知识专家网友:兮沫♡晨曦
- 2021-12-14 01:59
占个位置 我说说我的看法
昨天占了位置 今天说说
johnbiter 的库函数说是不正确的 sizeof是运算符 不是函数
我认同QQ_qmin的理解
先说下
double a;
int b;
sizeof(a+b)我想毫无疑问是8
sizeof(a+b+b)也还是8 不会有问题
sizeof(a+'b'+'b')是8应该也不会有问题吧
楼主sizeof问题特殊在"abcdefg"上 这是个const char数组
也就是个静态数组 我认为sizeof求静态数组实际上是没有意义的
如果不是静态数组
int data[10];
cout<
结果应该是4 返回一个指针的类型大小,像上面QQ_qmin的理解那样
静态数组的大小是一定的 按照C++的原则 程序员是知道而且一定知道静态数组的大小的 所以在用sizeof应该没什么意义
所以类似sizeof("abcdefg" + '2')到底是指针还是静态数组的大小都无所谓。具体是否与编译器有关也不得而知,我记得以前C里sizeof('2')是等于2的 也就是一个整形的占用大小~
////////////////////////////////////////////////////////
又要修改回答了
QQ_qmin后面的理解是错误的
char p[] = "abcdefg";
sizeof(p)//结果是8
sizeof(p+2)//结果是4,此时p被看为指针。
如果照此说
sizeof(p)=sizeof("abcdefg")
而sizeof(p+2)=sizeof("abcdefg"+2)
结果恰恰不是。sizeof(p+2)不等于sizeof("abcdefg"+2)
char p[] = "abcdefg";的"abcdefg"是p的初始化器,不是静态字符数组
,是不放在堆中的。
//引用下///////////////////////////////引用下
“abcdefg”+'2' 实际上是对指针+50
对于编译器来说
int a[8] = "abcdefg";
a+50;//p变了吗? p 根本没有变
///////////////////////////////////
为什么加50没有变 在加50就变了呢?
而不像我上面diuble类型那样 一直不变呢?
昨天占了位置 今天说说
johnbiter 的库函数说是不正确的 sizeof是运算符 不是函数
我认同QQ_qmin的理解
先说下
double a;
int b;
sizeof(a+b)我想毫无疑问是8
sizeof(a+b+b)也还是8 不会有问题
sizeof(a+'b'+'b')是8应该也不会有问题吧
楼主sizeof问题特殊在"abcdefg"上 这是个const char数组
也就是个静态数组 我认为sizeof求静态数组实际上是没有意义的
如果不是静态数组
int data[10];
cout<
静态数组的大小是一定的 按照C++的原则 程序员是知道而且一定知道静态数组的大小的 所以在用sizeof应该没什么意义
所以类似sizeof("abcdefg" + '2')到底是指针还是静态数组的大小都无所谓。具体是否与编译器有关也不得而知,我记得以前C里sizeof('2')是等于2的 也就是一个整形的占用大小~
////////////////////////////////////////////////////////
又要修改回答了
QQ_qmin后面的理解是错误的
char p[] = "abcdefg";
sizeof(p)//结果是8
sizeof(p+2)//结果是4,此时p被看为指针。
如果照此说
sizeof(p)=sizeof("abcdefg")
而sizeof(p+2)=sizeof("abcdefg"+2)
结果恰恰不是。sizeof(p+2)不等于sizeof("abcdefg"+2)
char p[] = "abcdefg";的"abcdefg"是p的初始化器,不是静态字符数组
,是不放在堆中的。
//引用下///////////////////////////////引用下
“abcdefg”+'2' 实际上是对指针+50
对于编译器来说
int a[8] = "abcdefg";
a+50;//p变了吗? p 根本没有变
///////////////////////////////////
为什么加50没有变 在加50就变了呢?
而不像我上面diuble类型那样 一直不变呢?
全部回答
- 1楼网友:我叫很个性
- 2021-12-14 06:39
#include"stdio.h"
main()
{int t;
t=sizeof("abcdefg"+'2');
printf("%d",t);
}
8楼下说的没错。
- 2楼网友:废途浑身病态
- 2021-12-14 06:03
只知道是8
abcdefg”+'2' +‘2’结果是4又怎么解释呢? 高手,i 服了
- 3楼网友:青灯壁纸妹
- 2021-12-14 04:51
sizeof()库函数,只是算出变量类型所占地址空间大小的, 和变量的具体的值是没有关系的.
sizeof("abcdefg" + '2')
-〉char *b;
b= "abcdefg" + '2';
sizeof(b);
应为b是char类型的,只给他分配四个字节的地址空间,所以结果肯定是4,如果你是32位机器的话。
- 4楼网友:留下所有热言
- 2021-12-14 04:35
结果为:8 和10
一个字符占一个字节,sizeof就是求所占的字节数的。
a编译会自动在后面添加一个'\0'表示结束符,所以为 7+1=8。
b是一个静态数组,里面的10表示其元素的个数,系统分配的时候按照这个来分配。
- 5楼网友:woshuo
- 2021-12-14 03:08
不同意上面的答案,abcdefg是7个字节,但字符串有结束符'\0',sizeof("abcdefg")一定也是8,并不是因为加了‘2’
原因应该是因为sizeof是在预编译阶段计算,他不需要知道操作数具体的值,只需要知道操作数的类型,因为类型“abcdefg”的字节数是8,对编译器来说,加上任何数字('2'实际是ascll码50)都不能改变“abcdefg”的类型,所以答案是8
“abcdefg”+'2' 实际上是对指针+50
对于编译器来说
int a[8] = "abcdefg";
a+50;//p变了吗? p 根本没有变
sizeof(a)//这个值应该是多少? 是8对吧!! :)
sizeof("abcdefg"+'2'+'2')首先要明白对于编译器来说他计算的是什么的,上面的式子可以用什么来替换,我是替换成sizeof(("abcdefg"+‘2’)+‘2’),那么sizeof中操作数应该是什么的结果?是"abcdefg"+'2'的结果,对于一个字符串加‘2’,在编译器认为是对指针加'2',所以sizeof操作数是一个指针,所以结果为4,
我们换个形势看这个问题,
char p[] = "abcdefg";
sizeof(p)//结果是8
sizeof(p+2)//结果是4,此时p被看为指针。
继续跟进这个问题的答案。
"abcdefg"字符串常量开始的时候是不会在内存中分配地址的,只有对它进行需要取地址的操作后才能让字符串常量在内存中占有一定的地址。
所以第一次的+'2'操作只是让"abcdefg"字符串在内存中分配一定的地址,但sizeof的操作数还是字符串(即此时的操作类似与char p[]= "abcdefg"; sizeof(p);),
第二次加'2'才是对数组名加'2'
把我觉得例子稍写的更清晰点是:
char p[] = "abcdefg";
sizeof("abcdefg")//结果是8
sizeof(p)//结果是8,相当于sizeof("abcdefg"+'2');
sizeof(p + '2')//结果是4,相当于sizeof("abcdefg"+'2'+'2');
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯