关于C++的一点问题:tolower函数和vector的迭代器问题,谢谢大虾们指点迷津

来源:百度知道 编辑:UC知道 时间:2024/06/14 05:24:17
(1)、如下代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{string s("HELLO")
for(int i=0;i<5;i++)
s[i]=tolower(s[i]); //若此行改为:cout<<tolower(s[i])<<endl;
cout<<s;
return 0;}
左边的代码结果很明显是:hello 而右边代码却得到换行的:104 101 ……我想请问,右边的代码为什么得到的却是这个结果?

(2)、在我看primer时,记得有vector的迭代器使用时有这么一行代码:
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end;++iter)我想请问,为什么这里用的是前置自增操作符,而不是后置的?因为我实在没弄明白,第一个元素是怎么处理的?

(3)、一个代码段里,我加入有3个嵌套的循环 我在最后一个循环下面写了一个IF语句 然后break 那他退出的是最后那个循环还是整个?

楼上的,你也太经典了吧?

1.看tolower声明:
template<Class CharType>
CharType tolower(
CharType _Ch,
const locale& _Loc
)
具体到C库中:
int __cdecl tolower(_In_ int _C);
看到返回值没?

你左边的用法能够自动被转换成char.不信你在程序中添加char a = 78;绝对不会报错。这才是根本原因。
printf从来不用。

2.有区别
因为在内部的实现上,后置++是根据前置++来实现的,后置++在重载的时候构建了一个临时变量,如:
T operator ++ (int)
{
T tmp; //这里应该T tmp(*this);写错了
++(*this);
return tmp;
}
你觉得用什么更快呢?

3.break只管循环结构的退出。退出if?你没搞错吧?如果你需要这样的话说明你的设计有问题。因为if在设计的时候就是拿来做一次性作用的,要循环为什么不用while???
goto?算了吧,你等着郁闷吧。

}

cout这个语句我并不觉得有多好,为什么一堆人用。
假如你用printf("%c",tolower(s[i]))就不会有问题
cout有时太自作主张了
不过你也可以试试看 cout<<(char)tolower(s[i])<<endl; 行不行

(2)for后面的++iter和iter++其实没什么区别 你试试看就知道了,效果一样

(3)只能退出一层 想退出多层我知道的只能用goto 了

初学的话先不要看primer,找本基础的来看懂了再看那,这基本的还没有懂看到后面完全没有感觉