BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #101656同步于 2025/8/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

【问题】GESP 24年12月3级选择题第9题:string访问越界的疑问?

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