#include <algorithm>
#include <iostream>#include <cstring>int main()
{ //一个基类型为const char*的数组, const char*类型本质上就是一些C风格的字符串常量。特别注意NULL是个特例。char const* strings[] = {
"hello",
"world", "computers", "are", "awesome", NULL //这里是故意这样设置的,经过测试程序是支持对NULL元素的比较 的。要在比较函数中处理。};
//可以在函数内部定义结构体。
struct { bool operator()(char const* a, char const* b) const { //a&&b保证调用strcmp的前的正确性判断。 //许多标准库中的函数都没有提供合法性检验。比如开方函数sqrt, 参数是有符号类型的,但是计算-1的结果却得不到正确的值. //当a,b都可以保证是非空时,对a,b进行字符串比较,strcmp(a,b)<0在sort函数中等价于对字符串进行字典升序排序。而a,b有一个为空时,按字符串表示的地址进行比较,因为有效地址总是大于NULL,所以a<b相当于,排序时将NULL放在开头。 //当a<b时,strcmp返回值小于0 return (a && b) ? 0 > strcmp(a, b) : a < b; } } cmp; //声明一个函数对象。std::sort(std::begin(strings), std::end(strings), cmp); //这里注意begin,end两个函数的用法。
//s可能取NULL所以需要对s的值进行判断,否则会报错。另外注意对于条件表达式最好在外面整体套上括号,特别是出现在cout语句中。否则可能出现意想不到的情况。比如这里如果不加括号,结合情况就变成了“NULL"<<"\n"的整体再与:结合,并报错“表达式必须具有整数或未区分范围的枚举类型”,应该是将<<当作移位运算符,但提示“NULL"和“\n”不能用于移位运算。
for (auto& s : strings) //c++中的foreach语句 std::cout << ((NULL!=s)?s:"NULL" )<< "\n";
std::cout <<(1? 2 << '\n':4) << std::endl; //输出2048,即将2左移10位
//‘\n'的ascii码值0x0A,2*1024=2048).移位的位数必须是与整型兼容的类型,字符串类型是绝对不可以的。就向上面报错的那样。
return 0;
}