首页 > 编程语言 >C++要点细细梳理——trivial:运算符优先级、switch、临时变量默认赋值等

C++要点细细梳理——trivial:运算符优先级、switch、临时变量默认赋值等

时间:2024-04-08 17:58:25浏览次数:29  
标签:优先级 整数 C语言 运算符 switch C++ 赋值

1. 运算符优先级

在这里插入图片描述

在C语言中,运算符的优先级决定了在表达式中各个运算符的执行顺序。当一个表达式中有多个运算符时,优先级高的运算符会先被计算。如果两个运算符的优先级相同,那么它们的结合性(从左到右或从右到左)会决定它们的计算顺序。

以下是一些基本的C语言运算符优先级(从高到低):

  1. 后缀运算符:例如数组下标[]、函数调用()、成员访问.->、后缀递增++和后缀递减--

  2. 一元运算符:例如前缀递增++、前缀递减--、取地址&、解引用*、正负号+-、位非~、逻辑非!、类型转换(type)、大小操作符sizeof

  3. 乘法运算符*(乘法)、/(除法)、%(取模)。

  4. 加法运算符+(加法)、-(减法)。

  5. 位移运算符<<(左移)、>>(右移)。

  6. 关系运算符<(小于)、<=(小于等于)、>(大于)、>=(大于等于)。

  7. 相等运算符==(等于)、!=(不等于)。

  8. 位与运算符&

  9. 位异或运算符^

  10. 位或运算符|

  11. 逻辑与运算符&&

  12. 逻辑或运算符||

  13. 条件运算符? :

  14. 赋值运算符:例如=+=-=*=/=%=<<=>>=&=^=|=

  15. 逗号运算符,

当表达式中的运算符优先级相同时,它们会按照从左到右的顺序进行计算,除非运算符的结合性是从右到左(例如赋值运算符和条件运算符)。

例如,在表达式a = b + c * d中,乘法运算符*的优先级高于加法运算符+,所以c * d会先被计算,然后其结果再与b相加,最后赋值给a

了解运算符的优先级对于编写正确和易于理解的代码是非常重要的。如果需要改变默认的运算顺序,可以使用括号来明确指定优先级。

在这里插入图片描述

例题:

#include <iostream>

int main() {
	int i = 10;
	printf("%d", i %= 2 ? 1 : 2);
	return 0;
}

上述代码的输出为什么是0而不是2?

上述代码的输出是0而不是2,是因为在C++中,条件运算符(? :)的优先级高于赋值运算符(=)。

根据C++的运算符优先级规则,条件运算符的优先级高于赋值运算符。因此,在执行i %= 2 ? 1 : 2时,先进行条件运算符的判断,然后根据判断结果进行赋值操作。

具体来说,首先计算i %= 2,即i = i % 2,将i的值更新为10 % 2的结果,即0。然后,根据条件运算符的判断结果,如果条件为真(非零),则取第二个操作数的值,即2;如果条件为假(零),则取第三个操作数的值,即1。

由于i的值为0,满足条件运算符的条件(非零),所以最终的结果是2。但是,由于printf函数中的格式化字符串是"%d",它只会输出整数部分,而不会输出小数部分。因此,即使结果为2,输出仍然是0。

swtich括号内的数据只能是整型?

在C语言中,switch 语句括号内的表达式的结果必须是一个整数类型(包括 char,因为 char 在C语言中本质上是一种小的整数类型)。这意味着你不能直接使用浮点数、字符串或其他非整数类型的值作为 switch 语句的条件。

然而,你可以通过一些转换或技巧来使用非整数类型的值。例如,如果你有一个浮点数并且想基于它的整数部分进行切换,你可以将其转换为整数。对于字符串,你可以使用字符串的哈希值或某种形式的编码作为 switch 语句的条件。

但请注意,这样的做法可能会使代码变得复杂且难以维护,因此在实践中并不常见。对于非整数类型的值,通常更推荐使用 ifelse if 语句进行条件判断。

总结来说,虽然 switch 语句在C语言中主要用于整数类型的值,但通过一些技巧,你也可以间接地使用非整数类型的值。然而,这通常不是最佳实践,除非有特定的需求或理由。

c语言函数内部定义的临时变量有默认赋值吗?

在C语言中,如果你在函数内部定义了临时变量(也称为局部变量),那么这些变量不会自动被赋予默认值。它们的初始值是未定义的,这意味着它们包含的是它们所在内存位置的当前值,这些值可能是随机的、不可预测的,并且可能包含垃圾值。

为了避免使用未初始化的变量,你应该在声明变量时立即给它们赋值。这样,你就可以确保你的程序使用的是预期的值,而不是内存中的随机值。

例如:

int myFunction() {
    int myVar = 0; // 初始化为0
    // ... 其他代码 ...
    return myVar;
}

在这个例子中,myVar 被初始化为0,所以你可以安全地在后续的代码中使用它,而不必担心它包含的是未定义的值。

标签:优先级,整数,C语言,运算符,switch,C++,赋值
From: https://blog.csdn.net/qq_48035645/article/details/137431948

相关文章

  • C++中的 =default
    参考:链接每当我们声明一个有参构造函数时,编译器就不会创建默认构造函数。如下代码就会发生错误://useofdefaultedfunctions#include<iostream>usingnamespacestd;classA{public://Auser-definedA(intx){cout<<"Thisisaparameterizedco......
  • 突破编程_C++_网络编程(Windows 套接字(常用数据结构))
    1WSADATAWSADATA结构体包含了关于Winsock实现的一些详细信息,定义如下:structWSAData{WORDwVersion;//Winsock版本号WORDwHighVersion;//Winsock动态库支持的最高版本号charszDescription[WSADESCRIPTION_LEN+1];//Winsock描......
  • 突破编程_C++_网络编程(Windows 套接字(API 接口(1)))
    1初始化与清理1.1WSAStartupWSAStartup函数用于初始化Winsock库,并指定应用程序所需的Winsock版本。它允许应用程序与WinsockDLL(动态链接库)建立联系,并准备Winsock环境以供后续使用。(1)函数原型如下:intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData......
  • 【每周例题】蓝桥杯 C++ 对称排序
    对称排序题目对称排序 题目分析1.因为数字是对称交换,所以我们只需要判断前n/2项需不需要交换就好了2.这里我采用了升序排序,你们也可以尝试降序排序3.我们只需要排序好后再遍历一下整个数组,找出不符合排序的就输出NO就好了代码#include<iostream>#include<bits/stdc+......
  • 前端学习<四>JavaScript基础——11-流程控制语句:选择结构(if和switch)
    代码块用{}包围起来的代码,就是代码块。在ES5语法中,代码块,只具有分组的作用,没有其他的用途。代码块中的内容,在外部是完全可见的。举例: {   vara=2;   alert('qianguyihao');   console.log('千古壹号'); } ​ console.log('a='+a);打印结......
  • 前端学习<四>JavaScript基础——10-运算符
    我们在前面讲过变量,本文讲一下运算符和表达式。运算符的定义和分类运算符的定义运算符:也叫操作符,是一种符号。通过运算符可以对一个或多个值进行运算,并获取运算结果。表达式:数字、运算符、变量的组合(组成的式子)。表达式最终都会有一个运算结果,我们将这个结果称为表达式的......
  • 计算机毕业设计项目:springboot 智能答疑系统 96852(开题答辩+程序定制+全套文案 )上万套
    毕业论文(设计) 题   目springboot智能答疑系统学   院       XXXXX     专业班级   XXXXX学生姓名       XXXX    指导教师            XXXX          撰写日期:202 年 月 日目 录摘要......
  • 计算机毕业设计项目:新生儿疫苗接种管理系统 87023(开题答辩+程序定制+全套文案 )上万套
    PHP新生儿疫苗接种管理系统系   院XXXX学科门类XXX专   业 XXX班级XXX学   号XXX姓   名XXX指导教师XXX教师职称XXX摘 要新生儿计划免疫是根据危害儿童健康的一些传染病,利用安全有效的疫苗,按照规定的免疫程序进行预防接种,......
  • c++类与对象<三>初始化列表,静态成员,友元,匿名对象
    目录前言一:再次认识构造函数之成员初始化列表初始化成员变量1.类对象整体的定义与对象中每个成员变量的定义2.初始化列表3.explicit 关键字二:static成员 1.概念2.经典实例:实现一个类,计算程序中创建出了多少个类对象3.特点总结 三:匿名对象 1.匿名对象就像结构体......
  • c++primer 9.52答案
    萌新业余时间学c++中,学过一点c之前,下面一个自己写的9.52答案,尽量用到了前面学到的知识,与大加分享交流一下,希望能互相讨论学习。/*******************************************************************************************@FilePath:MyDate.h*@Author:YMM*@Date......