返回信息流第 9 题 下列程序输出的是( )
string ch="hello";
if(ch[5]==NULL)
{
cout<<"right"<<endl;
}
else if (ch[5]=='\0')
{
cout<<"wrong"<<endl;
}
else
{
cout<<"hello"<<endl;
}
A. right
B. wrong
C. hello
D. 不能正确执行
这道题gesp官方参考答案是A。
我在gesp推荐环境dev c++ 运行确实是A。
(gesp官方是计算机学会,也是noi的官方。)
我原本认为ch[5]越界,它的值可能是任何值。这道题要不是题错了,要不选D。
请教一下c++专业人士,这是不是越界未定义行为。还是有什么c++标准规定?为什么ch[5]==NULL成立?
感谢指导。
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #101656同步于 2025/8/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
【问题】GESP 24年12月3级选择题第9题:string访问越界的疑问?
cling1988
2025/8/14镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
faq1:相当的江沪浙小学生三年级开始学习c++,进行信竞启蒙。这已经是现实。讨论该不该早期启蒙,意义不大。
faq2:为什么问c++未定义行为的问题?为什么不查书?我提出的关于未定义行为问题通常是行业内权威材料中发现的问题。这让我产生了疑问,我想确定c++标准到底是什么。c++的资料太多了,我怕查漏了,就像部分权威人士也会搞错。
同张试卷判断题第7题 也有相同疑问
string ch="chen";
cout<<ch[4]<<endl;
该段程序将不能正确执行
官方答案"错误",即该程序可以正确执行
https://en.cppreference.com/w/cpp/string/basic_string/operator_at.html
C++11之前,试图访问std::string("hello")[5]就是未定义行为。但C++11开始会返回一个指向'\0'的引用,但你不能修改它。
但是不管怎么样,把char和NULL相互比较应该是编译错误。应该和'\0'比较。
标准说的是返回ChartT() 对于std::string 就是char()
char c = char();
cout<<(int)c; //0
cout<<(c == '\0'); //1
谢谢大家。学习新知识了。
【 在 cling1988 的大作中提到: 】
: 第 9 题 下列程序输出的是( )
: string ch="hello";
: if(ch[5]==NULL)
: ...................
我是C++初学者,以下是我的理解。最近在看primer plus的时候提到C++在实现string的时候会在字符串末尾储存一个\0,一般无法被访问到,的确属于越界。但C++11以后的访问行为通常会被转换为0这个数字,满足NULL。其实第二个=='\0'的条件同样成立,但是if语句在前所以优先执行第一条语句。有不对的地方请大佬指正。
第四楼正解。这个知识点还是当年学谭浩强的C语言编程,课上学的。lz是自学?这个和权威不权威没关系,包括未定义行为,不是什么大忌。表面看是考一些特殊情况,本质是考察对于C/C++语言本质的理解:直接操作内存、数据类型的存储本质等等。
其实他说的是c++ string。
【 在 kenshin 的大作中提到: 】
: 第四楼正解。这个知识点还是当年学谭浩强的C语言编程,课上学的。lz是自学?这个和权威不权威没关系,包括未定义行为,不是什么大忌。表面看是考一些特殊情况,本质是考察对于C/C++语言本质的理解:直接操作内存、数据类型的存储本质等等。