首页 > 其他分享 >C语言【运算符】

C语言【运算符】

时间:2023-11-17 21:12:44浏览次数:33  
标签:10 int C语言 运算符 按位 printf 赋值

C语言【运算符、分支控制语句】

1、运算符分类
  • 按照操作个数分类:

    一元运算符(一目运算符):只有一个操作数。如 负号 -1。

    二元运算符(二目运算符):有两个操作数。如 加号 1+2。

    三元运算符(三目运算符):有三个操作数。如 ?: a>b?1:2。

  • 按功能分类:

    算数运算符:正(+)、负(-)、加(+)、减(-)、乘(*)、除(/)、取模(%)、自增(++)、自减(--)。

    赋值运算符:赋值(=)、相加赋值(+=)、相减赋值(-=)、相乘赋值(*=)、相除赋值(/=)、取余赋值(%=)、左移赋值(<<=)、右移赋值(>>=)、按位与赋值(&=)、按位异或赋值(^=)、按位或赋值(|=)。

    int te = 0;
    // if里是赋值
    if(te = 0){     		// te=0 的结果为所赋的0
    	printf("abcdefg");	// 不会执行
    }
    
    // 连续赋值
    int a = b = c = 6;	// 从右往左赋值,a、b、c都为6
    
    // 相乘赋值+连续赋值
    int a = 2;
    int c; 	// 下面中间那个c得提前定义。
    int b = c = a*=3;  	// a、b、c都为6
    

    ​ 赋值运算符一般是从右往左运算。运算方向是当表达式中出现多个该运算符时每个运算符的操作顺序。

    关系运算符:相等(==)、不等(!=)、小于(<)、大于(>)、小于等于(<=)、大于等于(>=)。

    ​ 关系运算符的结果为0或1

    逻辑运算符:逻辑与(&&)、逻辑或(||)、逻辑非(!)

    ​ 逻辑与(&&)也叫短路与,如果&&前面的表达式为0时,后面的表达式不作运算,直接返回为0;

    ​ 逻辑或(||)也叫短路或,如果||前面的表达式为1时,后面的表达式不作运算,直接返回1。

    ​ 在表达式前加逻辑非时记得给表达式加括号。

    ​ 逻辑运算符的结果为0或1

    位运算符:按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、按位左移(<<)、按位右移(>>)

    左移n位就相当于乘2的n次方右移n位就相当于除以2的n次方

    int a = 10;
     a >> 3;		// a不发生改变,因为没有再赋值给a
    
    int b = 10;
    b = b >> 3; 	// b在原来的基础上缩小了2的3次方。 10 / 3 = 1
    
    int y = -10;
    y = y >> 2;
    printf("%d\n", y);		// -3        
    //   -10 / 4 = -2...-2     把商的-2退为-3, 即 -10 / 4 = -3...2
    

    负整数的除法和右移操作结果并不一样,如下:

    int z = -10 / 4;
    printf("%d\n", z);	// -2
    

    左移时出现的溢出问题:左移时,会出现结果大过所接收值类型范围导致溢出。

    // 第一种情况,如果只关心输出结果,而不关心是不是在类型范围内,可以在输出时使用大格式,把超出的看作有效
    int num_max = 0x7fffffff;
    num_max  = num_max<<2;   	// 乘4,已经超过了int能表示的范围
    printf("%lld", num_max);  	// 输出时使用 %lld 把超出的范围也视作有效
    
    // 第二种情况,就是想知道溢出后在有效范围内为多少,也就是这个数的实际值,可以看作对类型能表示的个数取余
    int num_max = 0x7fffffff;
    num_max  = num_max<<2;   	// 实际结果8589934588,超了。 8589934588 % int能表示的个数(4294967296) = 4294967292。   num_max类型为有符号int, 4294967292最高位为1,转换为原码为-4,所以num_max为-4。在内存种这32位里存的就是4294967292的二进制形式。
    printf("%d", num_max);  	//  %d 表示有符号int, 4294967292最高位为1,转换为原码为-4,输出-4
    

     有符号数右移时,对于负数,前面空出来的位全补1;对于正数,前面空出来的位全补0。

    遗留问题:按位异或可以实现交换两个变量的值,如何实现的?原理是什么?

2、运算符的优先级

​ 具体的不作了解,使用时不确定就用括号。

​ 总体来说:一元运算符 > 算数运算符 > 关系运算符 > 逻辑运算符 > 三元运算符 > 赋值运算符

从右到左运算是指同一表达式出现多次同一运算符时,运算的方向。

​ 右到左的运算符有: todo

3、记几个整型和浮点型之间的运算。
// 整型的除法运算
int num01 = 10;
int num02 = 3;
int num03 = num01 / num02;	// 3
// 浮点型接收整型的运算
float num04 = 10 / 3;	// 断点调试此处为3, printf用%f输出时记得补6位小数

问题:上行代码的num04如果用%f输出是3.000000,如果用%d输出呢?我试了试是0。为什么?

// 浮点型与整型的运算
float num05 = (float)10 / 3;	// 3.33333325
printf("%f\n", num05);		// printf用%f输出时保留6位小数为3.333333
// 浮点数参与的运算其实是四舍五入的,手动保留小数时也是四舍五入
float num06 = (float)20 / 3; 	//     6.66666651
printf("%f\n", num05);		// 6.666667
4、取余(%)操作时,余数的符号跟着被除数(前面的数)的符号。
5、关于自增(++)和 自减(--)

​ 不多解释,举个特别的例子。

/**
	i=i++时
	第一步:将i的值放到临时空间,作为后续运算的依据
	第二步:将i的值+1
	第三步:将临时空间里存进去的值拿出来赋给i (如果是j=i++时这一步就是赋给j)
*/
int i = 1;
i = i++;
printf("%d\n", i);	 // 1
/**
	i = ++i时
	不多解释,上面步骤 二、一、三
*/
int i = 1;
i = ++i;
printf("%d\n", i);	// 2

注意:以上这两种情况在gcc可以编译通过,在clang编译器编译时就会报错。

标签:10,int,C语言,运算符,按位,printf,赋值
From: https://www.cnblogs.com/wangsiyaoa/p/17839686.html

相关文章

  • c语言ATM机案例
    1#include<stdio.h>2intmain()3{4//password初始密码,input输入的密码money取款金额,balance卡余额,select选项,x表示输入密码的次数(错误的机会只有三次)5intpassword=1101,input,money,balance=300;6//select表示选择的选项7intselect......
  • PTAC语言删除字符串中的字串
    这是题目。初见觉得还好,谁知道越分析越操蛋暗含深意。仔细看,假设我们通过遍历s1删除了两个显性的cat,哎,剩下的是什么Tomisamalecat咋样,牛逼不。说明这题肯定会出现删除一次不够的样例sample。假设我们熟知C语言中#include<string.h>中的strcat,strstr,strcpy等函数,那么这题可以比......
  • C语言中的选择语句
    switch语句(一般使用在多分支的语句中,同时允许嵌套使用)最简单的格式如下:switch(整型表达式){ 语句项;}举个例子:#include<stdio.h>intmain(){intday=0;scanf("%d",&day)switch(day){case1: printf("星期一\n");case2: printf("星期二\n");case......
  • MATLAB/Simulink中调用C语言实现的传递函数
    1.引言在变流器控制中,通常采用C语言实现传递函数,且通常写成独立的C文件,本文简要介绍如何在MATLAB/Simulink中调用这些C文件。在本文中,采用C语言实现了一阶低通滤波器、二阶低通滤波器、滑动平均滤波器,具体代码见附录。同时需要安装C编译工具链,参考《UsingGCCwithMinGW》。2......
  • 使用C语言Beep()函数演奏歌曲
    曲子是大佬王宗贤的《孔雀之舞》,网上没有找到五线谱,只有简谱,而且曲子速度不明确。通过相关演奏音乐的可大体得知,因为连音较多,至10个小节处为24秒,所以每个小节是2.4秒,因为是2/4拍,每个小节是2拍,所以每半个拍子对应的时长是0.6秒,对应的是一个八分音符的音长,600毫秒在函数中用变量f控......
  • 数组下标运算符[]
    数组表示一块连续的特定类型对象组成的空间结构,指针通俗指代某个对象的地址(其实包含了地址和地址上对象大小两层意思),数组和指针不能等同。也许唯一的联系是,数组的运算采用指针的方式实现。所以当我们定义一个数组array时,数组array在大多数表达式中会转换成首元素的指针。而很多......
  • 入门c语言--3---关于qsort函数的一些理解
     qsort函数是c语言库函数的一种,作用是将所给的数组中的元素按要求进行排序。 qsort函数可以理解为冒泡函数的进阶,冒泡函数只能对一些如int,char等类型的数组进行排序,当遇到自主定义的struct类型的数组时便不能进行排序。此时便可以通过qsort函数进行排序。  在使用qsort函数......
  • 数据结构C语言之线性表
    发现更多计算机知识,欢迎访问Cr不是铬的个人网站1.1线性表的定义线性表是具有相同特性的数据元素的一个有限序列对应的逻辑结构图形:从线性表的定义中可以看出它的特性:(1)有穷性:一个线性表中的元素个数是有限的(2)一致性:一个线性表中所有元素的性质相同,即数据类型相同(3)序列性:各......
  • 实验4 C语言数组应用编程
    1实验任务1task1_1源代码1#include<stdio.h>2#defineN43voidtest1(){4inta[N]={1,9,8,4};5inti;6//输出数组a占用的内存字节数7printf("sizeof(a)=%d\n",sizeof(a));8//输出int类型数组a中每个元素的地址、值9for(i=0;i<N;......
  • c语言 函数参数个数影响
    参考:https://blog.csdn.net/Cheatscat/article/details/79306021https://blog.csdn.net/Dr_Haven/article/details/89383342一个函数的参数的数目过多(尤其是超过8个)显然是一种不可取的编程风格。参数的数目直接影响调用函数的速度,参数越多,调用函数越慢。参数的数目少,程序就显得......