首页 > 编程语言 >C/C++ 运算符相关注意事项

C/C++ 运算符相关注意事项

时间:2024-07-01 09:43:31浏览次数:19  
标签:类型转换 优先级 C++ 运算符 注意事项 重载 表达式

C/C++ 中的运算符是编程中不可或缺的一部分,它们用于执行各种算术、逻辑、比较等操作。在使用这些运算符时,需要注意多个方面以确保代码的正确性和效率。

以下是对 C/C++ 运算符使用注意事项的总结:

1. 数据类型匹配与转换

  • 算术运算符:注意操作数的数据类型,特别是整数和浮点数之间的操作。整数除法会舍弃小数部分,而浮点数除法会得到精确结果。
  • 类型转换:当操作数类型不同时,编译器会自动进行类型转换,通常是小类型向大类型转换(如 char 到 int 再到 float)。这可能导致数据精度损失。

2. 运算符优先级和结合性

  • 优先级:不同的运算符有不同的优先级,如一元运算符(如 !++--)优先级最高,其次是乘除求余,最后是加减。
  • 结合性:相同优先级的运算符根据结合性(左结合或右结合)从左到右或从右到左计算。赋值运算符是右结合的。

3. 逻辑和条件运算符

  • 逻辑运算符(&&||):具有短路特性,即如果左侧表达式的结果已能确定整个表达式的值,则不再计算右侧表达式。
  • 条件运算符(?:):注意表达式的真假判断以及返回值的类型匹配。

4. 自增和自减运算符

  • ++ 和 --:分为前缀形式和后缀形式,前者先改变值后返回,后者先返回原值后改变。在表达式中使用时要特别注意。
  • 优先级和结合性:自增/自减运算符优先级较高,但结合性是从右到左。

5. 赋值运算符

  • 左值和右值:赋值运算符的左侧必须是左值(支持赋值的表达式),右侧可以是右值或左值。
  • 类型转换:赋值时,如果左右两侧类型不同,编译器会自动进行类型转换。

6. 位运算符

  • 操作对象:位运算符作用于整数类型,把运算对象看作二进制的集合。
  • 操作规则:了解每个位运算符(如 &|^~<<>>)的具体操作规则。

7. 运算符重载

  • 重载范围:C++中除了少数几个运算符(如.::sizeof等)外,大多数运算符都可以重载。
  • 限制:重载不能改变运算符的优先级、结合性、操作数个数及语法结构。
  • 实现方式:运算符重载实质上是函数重载,可以通过成员函数或友元函数实现。

8. 其他注意事项

  • 避免未定义行为:不要在同一个表达式中对同一个对象进行既读又写的操作,特别是涉及自增/自减运算符时。
  • 可读性和可维护性:避免滥用运算符,特别是复杂的嵌套表达式,以提高代码的可读性和可维护性。
  • 并发和多线程:在并发或多线程编程中,非原子性的自增/自减操作需要特别注意线程安全问题。

9. 特定运算符的使用场景

  • switch 语句:仅适用于整数类型,不能用于浮点数和范围选择。
  • 指针运算符:使用指针前必须初始化,释放指针时使用delete必须对应new分配的内存。

通过遵循上述注意事项,可以更有效地使用 C/C++ 中的运算符,编写出既正确又高效的代码。

更进一步地,可参见如下详细介绍:

  1. 注意运算符优先级,避免非预期的结果
  2. 负号不应作用于无符号整数
  3. 位运算符不应作用于有符号整数
  4. 赋值运算符左右子表达式不应相同
  5. 除法和求余运算符左右子表达式不应相同
  6. 减法运算符左右子表达式不应相同
  7. 异或运算符左右子表达式不应相同
  8. &=、|=、^=、-=、/=、%= 左右子表达式不应相同
  9. 比较运算符左右子表达式不应相同
  10. 不应重复使用一元运算符

 

标签:类型转换,优先级,C++,运算符,注意事项,重载,表达式
From: https://www.cnblogs.com/lucky-bubble/p/18277423

相关文章

  • 第二章·数据类型与运算符
    第二章·数据类型与运算符文章目录第二章·数据类型与运算符数据类型分类基本数据类型整型(int)浮点型(float)复数(complex)属性与方法字符串(str)表示方式字符串运算符字符串的常见操作替换:replace()分割:split()去除两侧空格:strip()格式化输出索引和切片大小写转换查找......
  • C++文件路径处理3 - 判断指定目录的文件类型(文件夹|普通文件|软连接)
    1.关键词2.filetype.h3.filesystem.h4.filesystem_unix.cpp5.filesystem_win.cpp6.filepath.h7.filepath.cpp8.测试代码9.运行结果10.源码地址1.关键词关键词:C++文件路径处理文件夹普通文件软连接跨平台应用场景:根据指定的目录路径,判断该目录的文......
  • C++Primer Plus 第十四章代码重用:模板类和友元14.4.9 ----002
    C++PrimerPlus第十四章代码重用:模板类和友元14.4.9提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:模板类和友元14.4.9提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录C++PrimerPlus第十四章代码重用:模板类和友元14.4......
  • C++11新特性
    1.字符串原始字面量        在C++11中添加了定义原始字符串的字面量,定义方式为:R“xxx(原始字符串)xxx”其中()两边的字符串可以省略。原始字面量R可以直接表示字符串的实际含义,而不需要额外对字符串做转义或连接等操作。        比如:编程过程中,使用的字符串中......
  • C++11 mem_fn成员指针包装器
    C++11mem_fn成员指针包装器介绍函数模板std::mem_fn生成成员指针的包装器对象,用于存储、复制及调用成员指针。指向对象的引用和指针(包括智能指针)都可以在调用std::mem_fn时使用。注意:std::mem_fn只能包装public的成员指针,不能包装全局函数这里的成员指针指的是成员......
  • C++基础语法——《循环结构》题解
    循环结构参考资料:https://blog.csdn.net/m0_56945138/article/details/118929416需要掌握:1.for循环用法2.while循环用法3.continue跳过和break终止题号题目名称题解链接3067输出范围内的整数https://www.cnblogs.com/jyssh/p/182740551206简单的累加https://www......
  • CUDA编程的注意事项和使用流程详解
    目录一、背景二、CUDA编程的基本概念 2.1、CUDA线程(Thread):2.2、线程块(Block):2.3、网格(Grid):2.4、内存模型:三、CUDA编程流程3.1.环境配置3.2.编写CUDA代码 3.2.1、初始化和分配内存3.2.2、数据传输3.2.3、内核函数(Kernel)调用3.2.4、结果传回主机3.2.5、释放资源......
  • 【C++】三只小猪称体重
    基于“黑马程序员”视频有关c++学习(p1-p27)完成本节案例学习入口:https://www.bilibili.com/video/BV1et411b73Z?p=28&vd_source=02cd0dc9bea072ad5e681a740632d7a0题目:有三只小猪称体重,分别输入三只小猪的体重,看一下谁最重?分析:先比较任意两只小猪(A)、(B)    如果A......
  • C++ : 如何用C语言实现C++的虚函数机制?
    前言在 googletest的源码中,看到gtest-matchers.h中实现的MatcherBase 类自定义了一个VTable,这种设计实现了一种类似于C++虚函数的机制。C++中的虚函数机制实质上就是通过这种方式实现的,本文用c语言自定义虚函数表VTable实现了一下virtual的功能,来深刻理解其机制。我们通过创......
  • c++高精度计算-大整数相乘
    例题-信奥赛1307:【例1.3】高精度乘法题目描述:输入两个高精度正整数M和N(M和N均小于100位)。求这两个高精度数的积。输入:输入两个高精度正整数M和N。输出:求这两个高精度数的积。输入样例:363输出样例:108 做题思路:学习乘法的朋友大概对加减法都有一定的了解,我就......