表达式

左值和右值

  使用关键字decltype时,左值和右值有所不同。举例说明,假定p的类型时int*,因为解引用运算符生成左值,所以decltype(* p)的结果时int&。另一方面,因为取地址运算生成右值,所以decltype(&p)的结果是int**,即一个指向整型指针的指针。

求值顺序

  有些运算符如<<没有指定执行顺序,没有明确规定何时以及如何对运算对象求值,下面输出表达式的结果可能是 1 1 或者是 0 1 甚至是完全不同的操作,所以代码程序是错误的。

int i = 0;
cout<< i << " " << ++i << endl; //未定义 
处理复合表达式

  1、拿不准的时候最好用括号来强制让表达式的组合关系符合程序逻辑的要求。
  2、如果改变了某个运算对象的值,在表达式的其他地方不要再使用这个运算对象。

布尔值不应参与运算

  对大多数运算符来说,布尔类型的运算对象将被提升为int类型,布尔变量b的值为真,参与运算时将被提升为整数值1,求负后结果时-1。将-1再转回布尔值并将其作为b2的初始值,显然这个初始值不等于0,转换成布尔值后应该为1,所以b2为真。

bool b = true;
bool b2 = -b;                   // b2是true
递增递减运算符

  除非必须,否则不用递增递减运算符的后置版本,即使用 ++i 而非 i++ 。

auto pbeg = v.begin();
while(pbeg != v.end() && *pbeg >= 0)cout << *pbeg++ << endl;
成员访问

  ptr->mem 等价于 (*ptr).mem。

string s1 = "a string", *p = &s1;
auto n = s1.size();
n = (*p).size();                    // 若 n = *p.size()则错误
n = p->size();  
条件运算符
finalgrade = (grade > 90) ? "high pass": (grade < 60) ? "fail" : "pass";cout << ((grade < 60) ? "fail" : "pass");       // 注意要加上括号
sizeof运算符

  在sizeof的运算对象中解引用一个无效指针仍然是一种安全的行为,因为指针并没有被真正使用。

constexpr size_t sz = sizeof(ia)/sizeof(*ia);   // ia为数组,返回ia的元素数量
int arr[sz];                                    // 正确,sz为常量表达式
显式转换

  强制类型转换有static_cast、dynamic_cast、const_cast、reinterpret_cast。

static_cast

  任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。

  告诉编译器不在于精度损失,警告信息将关闭。可以用来找回存在于void*指针中的值,但应确保转换后所得的类型就是指针所指的类型,一旦不符将产生未定义的后果。

double slope = static_cast<double>(j)/i;void* p = &d;
double *dp = static_cast<double*>(p);

const_cast

  只能改变运算对象的底层const,去掉const性质。只有const_cast能改变表达式的常量属性。

const char *pc;
char *p = const_cast<char*>(pc);        // 正确,但通过p写值是未定义行为const char *cp;
char *q = static_cast<char*>(cp);       // 错误,static_cast不能转换掉const性质
static_cast<string>(cp);                // 正确,字符串字面值转换成string类型
const_cast<string>(cp);                 // 错误,const_cast只改变常量属性

reinterpret_cast

  通常为运算对象的位模式提供较低层次上的重新解释。使用它是非常危险的。

int *ip;
char *pc = reinterpret_cast<char*>(ip);     // pc所指的真实对象是int而非char
string str(pc);                             // 错误,pc不是字符指针



语句

空语句

  使用空语句应该加上注释,从而令读这段代码的人知道该语句是有意省略的。

检测空格、制表符、换行符等
// 此处的std::noskipws表示的是不忽略任何地方的空白(包括制表符和空格等)
while (cin >> std::noskipws >> cval)
{   ...     }
while(cin)
#include <iostream>
using namespace std;void main()
{do{int v1, v2;cout << "Please enter two numbers to sum:";if (cin >> v1 >> v2)cout << "Sum is : " << v1 + v2 << endl;}while (cin);
}
try throw catch
#include <iostream>
#include <stdexcept>                    //标准异常库
using namespace std;void main()
{int a,b;cout << "请输入相除的两个整数:";while (cin >> a >> b){try{if (b == 0)throw runtime_error("被除数不能为零");cout << static_cast<double>(a) / b << endl;cout << "请输入相除的两个整数:";}catch (runtime_error err){cout << err.what();         // 实例的成员函数,返回内容由编译其决定cout << "\n是否需要重新输入? Enter y or n:" << endl;char c;cin >> c;if (!cin || c == 'n')break;                  //break只能用在开关体或者循环体中  }//try是检测异常的,如果产生了异常,就throw(抛出)一个异常,然后被catch到,进行异常的处理  //如果没有catch部分,仅有try,仍然会报错 }
}

【C++笔记】表达式 语句相关推荐

  1. JavaScript学习笔记:语句

    JavaScript学习笔记:语句 JavaScript程序由语句组成,语句遵守特定的语法规则.例如:var语句.if语句.while语句.with语句.switch语句等. 1.块语句 块语句常用于 ...

  2. C++ 表达式语句 海伦的故事

    C++ 表达式语句 海伦的故事 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 把今天当成最后一天来过.-海伦 请读者在 ...

  3. 51单片机c语言运算符,51单片机表达式语句的用法解析

    描述 表达式语句是最基本的一种语句.不同的程序设计语言都会有不一样的表达式语句,如VB就是在表达式后面加入回车就构成了VB的表达式语句,而在51单片机的C语言中则是加入分号";"构 ...

  4. c语言表达式和表达式语句的区别,C语言中表达式和表达式语句的区别(什么又叫做表达式)?...

    满意答案 sfuejr22 2016.01.13 采纳率:56%    等级:7 已帮助:659人 表达式: 表达式是操作符.操作数和标点符号组成的序列,其目的是用来说明-个计算过程. 表达式可以嵌套 ...

  5. c语言表达式语句由,c语言六种基本语句是什么

    c语言六种基本语句是:1.表达式语句:2.标签语句:3.循环语句:4.复合语句:5.跳转语句:6.选择语句. C程序的执行部分是由语句组成的. 程序的功能也是由执行语句实现的. C语句可分为以下五类: ...

  6. java表达式语句_Java基础知识笔记第三章:运算符表达式语句

    算术运算符与表达式 操作符描述例子 + 加法 - 相加运算符两侧的值 A + B 等于 30 - 减法 - 左操作数减去右操作数 A – B 等于 -10 * 乘法 - 相乘操作符两侧的值 A * B ...

  7. 《JavaScript高级程序设计》读书笔记 ---if语句

    if语句 大多数编程语言中最为常用的一个语句就是if 语句.以下是if 语句的语法: if (condition) statement1 else statement2 其中的condition(条件 ...

  8. if else if语句的用法python_Python笔记3---if语句、if-elif-else 结构、使用if语句处理列表...

    五.if语句 5.1 一个简单示例 使用if 语句来正确地处理特殊情形. cars = ['audi', 'bmw', 'subaru', 'toyota'] for car in cars: if ...

  9. ES6笔记 -- 变量/语句声明

    关于变量声明 let的作用是声明一个作用域为某个代码块({})的变量(称为块级作用域) let不允许变量提升(注: 变量的使用在声明之前) 块级作用域里的let命令之前的区域称之为'暂时性死区', 这 ...

最新文章

  1. 打包tomcat没有xml文件_Spring Boot 项目打包 War 并部署到 Tomcat
  2. c语言指针要点,C语言指针的重点有哪些?
  3. 《软件测试实践--测试Web MSN》 之我的学习笔记(一)
  4. java解析getresponsebodyasstring_java读取网站内容的两种方法是什么呢?
  5. linux下普通用户更改密码原理(S权限)、SetUID
  6. android pptx mime类型,application/vnd.android.package-archive是Apk的MIME类型
  7. 使用命令重定向操作符 (Redirection Operators)
  8. Python数据挖掘-相关性-相关分析
  9. java 方法引用_JAVA 8 方法引用 - Method References
  10. 【转】互联网架构的三板斧
  11. vue的v-for循环普通数组、对象数组、对象、数字
  12. android第三方集成埋点,Android集成mPass 埋点遇到的问题
  13. SketchUp LayOut 剪贴簿制作技巧
  14. 审计机构不用计算机审计,计算机审计存在哪些风险
  15. MyBatis_1_MaBatis入门
  16. IO流文件指针(移动和获取文件读指针)
  17. win11提示windows许可证即将过期
  18. 洛谷 P1878 舞蹈课 解题报告
  19. 仿Win7屏保泡泡移动
  20. 关于在控制面板上软件卸载失败的问题

热门文章

  1. 分子排列不同会导致_武汉理工《Matter》:构筑晶体内跨尺度分子筛单晶反应器...
  2. STL常用函数总结-stack
  3. 【TensorFlow-windows】(六) CNN之Alex-net的测试
  4. ubuntu 20.04 DNS 设置
  5. ubuntu使用apt-get时出现could not get lock怎么解决
  6. 带参数的sigmoid
  7. android和httpClient
  8. MFC——在状态栏中显示滚动字幕
  9. 看到的一个很不错的分析LCA和RMQ的文章(转载,先收着)
  10. Educational Codeforces Round 55 (Rated for Div. 2)