为了账号安全,请及时绑定邮箱和手机立即绑定

为什么不管输入什么输出的都是16,问题出在哪里呢?

为什么不管输入什么输出的都是16,问题出在哪里呢?

C++
qq_遁去的一_1 2023-04-22 18:14:57
#include<iostream>#include<string>using namespace std;int main(){int n;string i;cin>>i;n=sizeof(i);cout<<n;return 0;}还有到底sizeof()函数要怎么用来求字符串的长度?请各位高手帮我解决一下,我是新手所以讲得具体点
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

sizeof不是拿来求字符串长度的 它是用来求大小的。

求string长度用 i.length();这个方法!这就是i的长度!

查看完整回答
反对 回复 2023-04-25
?
ITMISS

TA贡献1871条经验 获得超8个赞

string 是一个类 不是数据类型  
string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。
有sizeof()为12、32字节的库实现。 但是VC6.0测试后sizeof(string)=16.还是跟编译器有关。

首先看一下sizeof在msdn上的定义:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.
看到return这个字眼,是不是想到了函数?错了,sizeof不是一个函数,你见过给一个函数传参数,而不加括号的吗?sizeof可以,所以sizeof不是函数。网上有人说sizeof是一元操作符,但是我并不这么认为,因为sizeof更像一个特殊的宏,它是在编译阶段求值的。举个例子:

cout<<sizeof(int)<<endl; // 32位机上int长度为4
cout<<sizeof(1==2)<<endl; // == 操作符返回bool类型,相当于 cout<<sizeof(bool)<<endl;
在编译阶段已经被翻译为:
cout<<4<<endl;
cout<<1<<endl;
这里有个陷阱,看下面的程序:
int a = 0;
cout<<sizeof(a=3)<<endl;
cout<<a<<endl;
输出为什么是4,0而不是期望中的4,3???就在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码,所以sizeof作用范围内,也就是()里面的内容也不能被编译,而是被替换成类型。=操作符返回左操作数的类型,所以a=3相当于int,而代码也被替换为:
int a = 0;
cout<<4<<endl;
cout<<a<<endl;
所以,sizeof是不可能支持链式表达式的,这也是和一元操作符不一样的地方。
结论:不要把sizeof当成函数,也不要看作一元操作符,把他当成一个特殊的编译预处理。


查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信