chapter-4

C++ Primer第四章!

#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
#include<typeinfo>

using namespace std;

int main()
{
    //逻辑与(&&)、逻辑或(||),条件(?:),逗号(,)规定了运算对象求值顺序,先求左侧运算对象!
    //拿不准的时候用括号表达式强制更改组合关系;如果改变了某个运算对象的值,在表达式其他地方就不要再使用这个运算对象。
    //算术运算符(+、-、*、/、%、+、-),算术表达式有可能产生未定义结果,一是数学性质原因(如除数为0),二是计算机原因(如结果溢出)
    //运算符%,取余运算符,负责计算两个整数相除所得的余数!
    int ival1 = 42;
    double dval1 = 3.14;
    int ival2 = ival1 % 12;         //算术表达式的求值结果都是右值
    //int ival3 = ival1%dval1;      错误行为!
    //(-m)/n和m/(-n)都等于-(m/n);m%(-n)等于m%n、(-m)%n等于-(m%n)
    
    //关系运算符用于算术类型和指针类型,逻辑运算符用于任意能转换为布尔值类型,返回值都为布尔类型!
    //逻辑与、逻辑或具有短路求值策略,当且仅当左侧运算对象无法确定表达式的结果时才会计算右侧对象的值!
    vector<string> text = { "abcdefg" ,"hijklmn"};
    for (const auto &s : text)
    {
        cout << s;
        if (s.empty() || s[s.size() - 1] == '.')        //短路求值策略,只有当S非空时才会用下标运算符去访问它,避免bug!
            cout << endl;
        else
            cout << " ";
    }

    //进行比较运算时,除非比较对象是布尔类型,否则不要使用布尔面值true作为运算对象!
    //if(ival1==true)       不推荐这样使用,而推荐if(ival1)!

    //赋值不是初始化,赋值运算符左侧必须是一个可修改的左值。赋值运算符满足右结合律。
    int ival3, ival4,*pval;
    ival3 = ival4 = 0;      //正确:都被赋值为0
    //ival3=pval=0          错误,不能把指针的值赋给int

    //递增递减运算符,建议使用前置版本的元素符
    int i = 0, j;
    j = ++i;                //j=1,i=1前置版本得到递增之后的值
    cout << i << j<<endl;
    j = i++;                //j=1,i=2后置版本得到递增之前的值
    cout << i << j<<endl;

    //*p++等价于*(p++),即先解引用,再p++。等价于{*p;p++}
    string s1 = "abcdefg";
    auto beg = s1.begin();
    while (beg != s1.end() && !isspace(*beg))
    {
        //*beg=toupper(*beg++)      错误:右侧的运算对象改变了beg的值!等价于*(p+1)=toupper(*p)
        break;
    }

    //箭头运算符,返回一个左值,ptr->mem等价于(*ptr).mem
    string s2 = "a string", *p = &s1;
    auto n = s1.size();
    n = p->size();
    n = (*p).size();

    //条件运算符
    int grade = 90;
    string finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass";        //条件运算最好不要嵌套超过2层,代码可读性不好
    cout << ((grade>=60) ? "pass" : "fail");

    //位运算符,作用于整型类型的运算
    //c++标准库类型有bitset,位运算符同样能够用于bieset类。建议将位运算符仅用于处理无符号类型!
    unsigned char bits = 0233;
    bits<< 8;           //无符号char提升为int,左移运算符<<在右侧插补0,右移运算符在左侧插补0(具体视环境而定)
    bits >>3;
    ~bits;              //1置为0,0置为1
    unsigned char b1 = 0145, b2 = 0257;
    bits = b1&b2;       //(&/|/^),与都为1则为1,或有1则为1,异或有且只有一个1则为1

    //sizeof运算符,返回一个表达式或者类型所占的字节数(返回值为常量表达式constexpr)
    cout << sizeof(*p) << endl;     //sizeof不需要真的解引用指针也能知道他所指对象的类型,即大小。

    //逗号运算符,含有2个运算对象,从左到右顺序依次求值!
    for (int i = 0, j = 0; i < 3; ++i, ++j)
        cout << j << "-";
    cout << endl;

    //类型转换
    int ival7 = 3.14 + 3;       //3转为double型,double转为int
    //比int类型小的整型提升为较大的整型!long吗?
    //在条件中,非布尔值转为布尔类型!同时自定义类类型推荐定义向布尔转换的类型转换函数!
    //初始化中,右侧运算对象转为左侧对象类型!
    //函数调用时也会发生类型转换!

    //隐式类型转换
    int arry_a[10];
    int *p_arry = arry_a;       //ia转换成指向数组首元素的指针

    //常量整数值0或者字面值nullptr能转换成任意指针类型;指向任意非常量的指针能转换成void*;指向任意对象的指针能转换成const void*;

    //显示转换,转换的本质非常危险!
    //命名的强制类型转换,static_cast/dynamic_cast/const_cast/reinterpret_cast
    int i_cast = 1, j_cast = 2;
    double slope = static_cast<double>(j) / i;      //当转换时发生精度损失,使用强制转换时不会发生警告信息
    void *p_cast = &slope;
    double *pp_cast = static_cast<double*>(p_cast);
    //改变运算对象底层const
    const char *pc=" ";
    char *pc_cast = const_cast<char*>(pc);          //去掉常量属性
    //reinterpret_cast,为对象的模式提供较低层次上的重新解释

    int i_decltype,*pi_decltype;                            //#include<typeinfo>,typeid(p_decltype).name() 返回变量的类型
    decltype(i_decltype) p_decltype;                        //int
    decltype(*pi_decltype) pp_decltype=i_decltype;          //int&
    decltype(&pi_decltype) ppp_decltype=&pi_decltype;       //int**
    decltype((i_decltype)) pppp_decltype=i_decltype;        //int&
    cout << typeid(p_decltype).name() << endl;
    cout << typeid(pp_decltype).name() << endl;
    cout << typeid(ppp_decltype).name() << endl;
    cout << typeid(pppp_decltype).name() << endl;

    cin.ignore();

    return 0;
}

//左值可以位于赋值语句的左侧,而右值则不能。当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)
//int p;则decltype(p)返回的结果为int&,而decltype(&p)返回的结果为int**。
//P147页罗列了全部运算符,同一组优先级相同,组别越靠前优先级越高!

//主要介绍了C++的内置运算符,以及其优先律和结合律。接着简述了表达式中类型的相互转换原则,隐式转换和显示转换。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • Scala 模式匹配支持获取对象状态;获取对象状态的操作往往称为“提取”或“解构”。[P86] match 中的值...
    云之外阅读 416评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,766评论 1 10
  • ndarray简介 多维数组对象(ndarray)在运算上非常灵活,同长度的数组之间运算为各对应元素间的运算,而数...
    煜米地阅读 533评论 0 1
  • 一、词类 二、总结 前缀:a - 否定band - 小布条bar - 小木条dis - 否定re - ...
    大神华仔阅读 509评论 0 0