小猪猪C++笔记基础篇(五)表达式、语句

小猪猪C++笔记基础篇(五)

关键词:表达式、语句

本章的内容比较简单,基本上没有什么理解上的困难,都是知识上的问题。先开始想要不要写呢,本来是不准备写的,但是既然读了书就要做笔记,还是写一写,毕竟还是有点点收获的东西。那么,我只就一些容易弄糊涂和忽略的地方提出来,为日后变成作参考。

一、表达式

(一)概念

表达式时由一个或者多个运算对象组成的,对一个表达式求值将得到一个结果。把一个运算发和一个或者多个运算对象组合起来可以生成较为复杂的表达式。

作用于一个对象的运算符是一元运算符例如:“&”,“*”等。运用于两个对象的运算符是二元运算符,例如“+”、“-”、“==”、“!=”等。

在C++中表达式要么是左值,要么是右值。左值可以位于赋值语句的左侧、右值不能。当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的史诗,用的是对象的身份(在内存中的位置)。我们熟悉的运算符都是要用到左值的。

使用关键则decltype的时候,我们根据左值右值的判断可以知道decltype得到的类型。如果表达式求值的结果是左值,decltype得到一个引用类型,如果表达式求值结果是右值,则得到一个指针类型。例如int *p;那么decltype(*p),*p是左值,得到的是int &引用,decltype(&p)得到的结果是指针,int**。

(二)一些值得注意的运算符

取负,一元符号运算是对象值取负后,返回其(提升后)的副本。要注意,无符号型的数和BOOL型的数不能做这样的运算。无符号型取负值会提升成有符号类型,如果没有溢出就相安无事,如果溢出了一般会发生“环绕”,跟第一章中间讲的溢出差不多的性质。布尔型的数据取负后会提升成int型,我们知道true=1,取负就成了-1。但是对于bool型是非0为true,0为false,所以取负以后还是true。

取模运算“%”,我们规定m%(-n)=m%n,(-m)%n=-(m%n)。简单的说,取模运算的符号是由前面那个数的符号决定的。所说,(-m)%(-n)=-(m%n)。

递增运算符(++)和递减运算符(--),即为对象加1和对象减1。这两种运算也可以用于不支持算数运算的迭代器。我们以递增运算符为例,递减运算符类似,分为前置版本++i,和后置版本i++。前置版本的意思是先对i加1再作为左值返回,后置版本是将对象的原始值的副本作为右值返回,再自加。

int i=0;

int j=i++;

cout<<i<<" "<<j<<endl;

j=++i;

cout<<i<<" "<<j<<endl;

第一个j=i++;是j赋值为i的原始值副本以后,i再自加。第二个++i,是i先自加以后再赋值给j。一般我们更习惯用++i而不采用i++。

另外,还要值得注意的是,++运算符的优先级是高于解引用运算符的。我们假设p是一个指针,那么*p++的意思是*(p++);把p的值加1,然后返回p的值的初试副本作为其求值结果,解引的值是没有自加后的结果。

int a[10];

int *p=a;

for(int i=0;i<10;++i)

a[i]=i;

for(int i=0;i<10;++i)

{

cout<<*p++<<" ";

}

条件运算符(?:), 这里有几个有趣的例子。

int grade=50;

cout<<((grade<60)?"fail":"pass");

cout<<(grade<60)?"fail":"pass";

cout<<grade<60?"fail":"pass";

第三条cout语句是编译都通不过的,前面两条是对的。我们输出结果看一看。

第一个输出的是(grade<60)?"fail":"pass"这个语句的值,第二个输出的是1,其实就是grade<60的值是true。所以当你不清楚优先级的时候最稳妥的方法就是打括号。

位移运算符(<<,>>),按照二进制移动,记住左移<<变大,右移>>变小,多的去掉。我们可以用位移运算符来处理类似于BOOL型的数组问题,这里不详述。另外我们熟悉的cout<<,cin>>这种重载版本的IO运算符,IO重载我们会在后面的章节详述,需要了解的是“cout<<”返回的还是一个cout,cin是一个道理。

Sizeof()运算符,是的它是一个运算符,不是一个函数,它的运算结果部分的依赖于作用的类型。对应用类型执行sizeof()得到的是被引用对象所占空间大小。对指针执行sizeof()运算得到的是指针本身所占的空间。我们可以用下面这种语句来求数组元素的个数:

int a[10]={0};

cout<<"sizeof(a):"<<sizeof(a)<<endl;

cout<<"sizeof(*a):"<<sizeof(*a)<<endl;

cout<<sizeof(a)/sizeof(*a)<<endl;

显示转化static_cast。可以消除强制类型转换的时候报WARNNING

把常量转化成变量:const_cast;

隐式的类型转换我们再第一章中已经说过了,不再赘述。

在我们编程的过程中基本上碰到的一些奇怪的操作符就是上面着一些的,如果你的表达式得到的结果并不是你想要的最好的方法就是多试几遍。

歇口气,喝口水。如果您觉得这些对您一点点帮助或者写的有些问题,可以给我留言,来鼓励鼓励我吧~如果想抱走的话希望能够引用我的链接~么么哒。

二、语句

语句就是我们基本说的条件语句、迭代语句什么的,平时都很常用,这里只对一些需要注意的点说明一下。

if-else语句,这种语句我们都很熟悉,唯一需要说明的是,在C++中规定else是跟最近的未匹配的if配对。

if(a) if(b) else c;

这里的else 是跟if(b)匹配的。不过建议还是用花括号来明确表示吧。

Switch(){case:}语句。Switch内部的变量必须是个常量且为整数,char,int,bool都可以,但是不能是浮点数。另外每一个case对应一个break,如果不写break的话,会接着做下一条case,且不用满足下一条case的条件,这个应该都很熟悉了;不能够跨case声明变量。也就是

case 1:int a;break;

case 2:a=3;break;

这样是不行的,原因可以参见一下变量的作用域问题。

跳转语句break,continue。作用于最近的循环语句。Break是跳出循环,continue是碰到了以后不再做下面的语句,直接进入下一次循环。下面一小段代码可以说明这个问题:

int a[10];

for(int i=0;i<10;++i)

{

a[i]=i*6-i*i;

cout<<a[i]<<" ";

}

cout<<endl;

for(int i=0;i<10;++i)

{

if(a[i]>7)break;

cout<<a[i]<<" ";

}

cout<<endl;

for(int i=0;i<10;i++)

{

if(a[i]>7)continue;

cout<<a[i]<<" ";

}

Break是碰到大于7的数就跳出循环了。而continue是不输出大于7的数。

另外还有goto语句,一般都不会用到它,它会造成一些混乱,但是有时候却有你意想不到的奇效,不过还是能不用尽量不用吧,这属于高难度动作啦。

最后还有抛出异常语句,简单的说一下就是try{一段程序,有问题我们就throw一个异常}然后用catch接住这个异常并且做相应的处理。对于程序的健壮性和安全性的处理是件很困难的事情,经验很重要。

如果有人看是我写下去的动力啦~当然没人不看我也会写的,因为知识和成长是自己的~~~

时间: 2024-10-07 06:33:32

小猪猪C++笔记基础篇(五)表达式、语句的相关文章

小猪猪C++笔记基础篇(六)参数传递、函数重载、函数指针、调试帮助

小猪猪C++笔记基础篇(六) ————参数传递.函数重载.函数指针.调试帮助 关键词:参数传递.函数重载.函数指针.调试帮助 因为一些事情以及自己的懒惰,大概有一个星期没有继续读书了,已经不行了,赶紧写一篇压压惊.把我文章抱走的同学留个言嘛. 函数在变成里面是一个非常重要的组成部分,那么这一部分我们先简单的介绍一下参数是如何传递进入函数,函数如何返回结果的.然后我们再来看看函数重载是个什么样的机制,最后在介绍一下所谓的函数指针到底是个什么东西.那么直接开始正题吧: 一.函数的参数传递 我们知道函

C#笔记——基础篇

C#笔记——基础篇 一.入门知识 VS中的常用快捷键 Ctrl+K+D:快速对齐代码 Ctrl+Z:撤销 Ctrl+S:保存(一定要经常保存!) Ctrl+J:快速弹出智能提示 Shift+End .Shift+Home Ctrl+K+C:注释所选代码 Ctrl+K+U:取消对所选代码的注释 F1:转到帮助文档 折叠冗余代码:#Region 和#EndRegion 新建空的  tab键 新增子节点   回车键 新增兄弟节点 F7快捷截图 F8预览 .net/dotnet:一般指.Net Fram

Python学习笔记基础篇——总览

Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列表.字典.主文件判断.对象 Python学习笔记——基础篇1[第三周]——set集合 Python学习笔记——基础篇2[第三周]——计数器.有序字典.元组.单(双)向队列.深浅拷贝.函数.装饰器 Python学习笔记——基础篇[第四周]——迭代器&生成器.装饰器.递归.算法.正则表达式 Python

渗透学习笔记--基础篇--sql注入(字符型)

环境:dvwa1.7数据库:mysql前置知识:sql语句(Click me)      在进行sql注入前,我们先熟悉熟悉select语句.一.打开我们的sql终端 二.进入之后可以看到有mysql>我们输入sql语句,即可返回我们想要的结果,注意分号哟!我们使用的dvwa,在我们前几章设置的时候,会在数据库中生成一个dvwa的database:这里我们使用它来进行我们的select 语句:(1)使用dvwa数据库use dvwa;(2)在users表里查询用户名为'admin'的所有信息se

Python基础篇(五)

bool用于判断布尔值的结果是True还是False >>> bool("a") True >>> bool(3) True >>> bool("") False >>> bool(0) False Python中的elif类似于Java中的elseif >>> number = (int)(input("input a number: ")) input

iOS开发学习笔记:基础篇

iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境),Xcode是一个集成开发环境,包括了编辑器.调试.模拟器等等一系列方便开发和部署的工具,iOS SDK则是开发应用所必需,不同的SDK分别对应不同的iOS版本或设备,通常我们需要下载多个iOS SDK以确保我们开发的程序能够在不同版本的iOS上正常运行. 创建新工程 Xcode提供了很多种工程模

JavaScript笔记基础篇(二)

基础篇主要是总结一些工作中遇到的技术问题是如何解决的,应为本人属于刚入行阶段技术并非大神如果笔记中有哪些错误,或者自己的一些想法希望大家多多交流互相学习. 1.ToFixed()函数 今天在做Birt报表时, 要显示一列百分比的数据,但因一些特别的原因,不能使用使用百分比样式,即如果数据是0.9538不能显示成“95.38%”的样式,必须显示成“95.38”. 开始时想使用javascript的内置函数Math.round(),可Math.round()只能显示为整数,而不能保留小数. 再网上搜

python重点笔记-基础篇

本文是对基础的一个提炼:基础篇的知识点列表 1.print打印"..." print:print('Hello World!') 命令行模式: 运行Python,在命令行输入命令并执行. 程序模式: 写一段Python程序并运行. 注意:Linux中创建一个文件夹,touch test.py,在使用vim编辑,执行python test.py 可以将上述程序改成一个脚本,直接运行,需要为脚本语言指定解释器:#!/usr/bin/env python , 编辑后更改文件权限chmod 7

java 自学篇之表达式语句运算

第三章 表达式语句运算 从这里我们就要进入程序里面的语句了,无论是C C++还是java,它们都是有表达式语句运算等组成. 表达式:由操作数与运算符所组成:操作数可以是常量.变量也可以是方法,而运算符就是数学中的运算符号,如"+"."-"."*"."/"."%"等. 一个表达式引出这么多东西,下面我们来一一看看这是什么东西. 操作数:常量.变量或者方法(方法怎么用?) 常用运算符 运算符:数学中的运算符号,