在学习数组时碰到一些问题,还请大佬们指教一二
1.比如vs2017中如下代码,toupper是在cctype头文件中的,但是我开头除了写了string和vector头文件外根本就没写cctype,为何不发生错误。类似的问题还有好多,比如begin函数是在iterator头文件中的却也可以直接使用begin(某数组名),begin用于string或vector类型的不用开头声明好理解,可以理解为成员函数,这两种begin应该不是同一概念吧,再比如我定义ptrdiff_t类型(它在头文件cstddef中,按说定义个string类型都要写个头文件,这里却不要),使用函数strlen(在头文件cstring中),不添加头文件都不会出错等等
string s1 = "hello";
if (s1.begin() != s1.end()) {
auto it = s1.begin();
*it = toupper(*it);
}
2.比如定义char a[] = "asdf",a的类型是字符数组,为何反而auto a= "asdf"中a的类型是一个指向常量的指针(是指针我理解,但是为何const不理解,干嘛不保持一致,前者可以不是const,后者却一定要是const,而且对于后者按理来说a应该指向的是字符数组首元素才对啊,按理cout<<a输出的应该是第一个字符的地址才对啊,但是却输出的是asdf,而cout<<*a输出a,到和按通常理解的语法一致。还有一个问题,就是我直接输出cout<<strlen("asdf")没问题,但是auto n=strlen("asdf")为何却错了
1.比如vs2017中如下代码,toupper是在cctype头文件中的,但是我开头除了写了string和vector头文件外根本就没写cctype,为何不发生错误。类似的问题还有好多,比如begin函数是在iterator头文件中的却也可以直接使用begin(某数组名),begin用于string或vector类型的不用开头声明好理解,可以理解为成员函数,这两种begin应该不是同一概念吧,再比如我定义ptrdiff_t类型(它在头文件cstddef中,按说定义个string类型都要写个头文件,这里却不要),使用函数strlen(在头文件cstring中),不添加头文件都不会出错等等
string s1 = "hello";
if (s1.begin() != s1.end()) {
auto it = s1.begin();
*it = toupper(*it);
}
2.比如定义char a[] = "asdf",a的类型是字符数组,为何反而auto a= "asdf"中a的类型是一个指向常量的指针(是指针我理解,但是为何const不理解,干嘛不保持一致,前者可以不是const,后者却一定要是const,而且对于后者按理来说a应该指向的是字符数组首元素才对啊,按理cout<<a输出的应该是第一个字符的地址才对啊,但是却输出的是asdf,而cout<<*a输出a,到和按通常理解的语法一致。还有一个问题,就是我直接输出cout<<strlen("asdf")没问题,但是auto n=strlen("asdf")为何却错了