【有关问题】菜鸟问C++ Primer 4th 习题3.8,关于string的

【问题】初学者问C++ Primer 4th 习题3.8,关于string的
【原题】下列程序实现什么功能?实现合法吗?如果不合法,说明理由。
string s;
cout << s[0] << endl;

【题解】实现不合法,因为s是一个空字符串,其长度为0,因此s[0]是无效的。

【疑问】感觉题解木有问题,但是这个程序在Dev-C++中编译,未出现编译错误,做测试如下:
int main()
{
  string s;
  s[1] = 'f';
  cout << "*" << s[0]
  << "*" << s
  << "*" << s[1]
  << "*" << endl;
  return 0;
}

编译运行结果如下:
* **f*

s是空字符,s[0]是空格,而且可以给s[1]赋值且不影响s,这是怎么回事?

------解决方案--------------------
编译器会帮你检查语法,越界等问题需要你自己去控制

s是空的,你进行s[1]的已经越界了,结果无法预料
------解决方案--------------------
为什么在Dev-C++中不用#include <cctype >也能调用ispunct()这样的字符操作函数
----
不清楚,你可以查看你项目里包含的头文件,可能已经包含在某个头文件里了


在if语句里面,不能用if (!(ispunct(s[0])))这样的形式表示s的1位不是标点吗?
----

------解决方案--------------------
我觉得这是随机的,要看s+1这块地址可不可读,有时是可读的,这时这块地址就显示'f',有时不可读,那就会报错,很明显,这种做法是危险的。
------解决方案--------------------
1、不同编译器会有不同的默认处理,为了让你的代码能够移植,所以要避免这种写法。
2、这个还是跟编译器有关系,有的编译器它会默认包含一些头文件,就像你用VC6.0时, 不用加stdio.h ,还是可以用printf()函数一样。