C语言-运算符
一, 运算符:
连接操作数的一个符号,主要用于算术计算或者逻辑判断
分类:
1)参与运算的操作数的个数:单目运算(sizeOf() i++ 双目运算 三目运算 (条件运算符)
2)功能上:算术运算符 关系和逻辑运算符 位运算符
优先级:
不同的运算符的计算先后顺序
结合性:
前提:优先级相同
在优先级相同的情况下,到底先计算哪个
二、算术运算符包括哪些?
+ -(减) * / %
算术运算符是一个双目运算
优先级:不同的运算符的执行的先后顺序
结合性:左结合 a+3-2+b // + - + --->优先级4
注意事项
% 求余
m%n
1)注意:
m = 0 结果是0
n = 0 没有意义
m > n 正常取余
m < n 结果是m
2)求余的正负性
求余的正负性取决于m的正负性
3)求余只能用于整数 int i = 10.5%2 错误
三 , 数据类型转换问题
数据类型转换分为强制转换和隐式转换两种:
强制转换:
char c = 'A' ; int b = a +(int)c; //把字符型c强制转换为int
隐式转换:
int a = 10; float b = 0.5f; double f = a + b; // int类型的a 和float类型的b自动转换成double类型
四 :赋值运算符
简单赋值运算:int a = 10+1; a = b = 10; // 注意从右往左,因为赋值运算符优先级最低,
注意:不能赋值给常量 10 = a+b(错误)
因此if函数中得条件我们为了防止少写一个“=”号(编译器不会报错)我们一般将常量写在左边
复合赋值运算:
+= a+=3 // a = a+3;
-= a-=3 // a = a-3;
*=
/=
%=
同样赋值运算符的计算首先考虑的是运算符的优先级,然后同优先级的情况下考虑结合顺序
五 : 自增、自减
1> i++ ,表示先取出i的值作为表达式的值 a + i++ -->a + 5, a = 6; ++i ,表示先让变量值+1,然后再取出i的作为表达式的值 进行计算
2>i++ 先用后变, ++i 先变后用
3> int a = 10;
将a加1有四种方式
(1) a = a+1 , (2) a +=1; (3) a++; (4) ++a;
注意:int d=1++;//这种写法是错误的,因为对常量进行自加和自减没有任何意义。
int i = 5, j = 5, p, q;
// 5/6 + 6/7 + 7/8
p=(i++)+(i++)+(i++);
q=j+++j+++j++;
printf("%d,%d,%d,%d",p,q,i,j); //18 18 8 8
六: sizeof运算符
作用:计算常量、变量、数据类型在内存中分配的字节数
注意:sizeof(char) // 1个字节 ;表示程序要内存分配char数据类型1个字节内存空间
sizeof('a') // 4个字节;字符常量在内存中以他的ascii码存储 65 -->int
sizeof("aa") // 3个字节; c语言中得字符串是由字符数组构成一个字符占1个字节并且字符串结束由\0结尾(\0表示字符串结束)
1)sizeof作用常量和变量的时候,括号可以省略
2)sizeof不能计算函数占用的字节数
七,逗号运算符
逗号运算符:“,”
逗号表达式:用“,”将多个表达式连接到一起,组成一个新的表达式,这个新的表达式就称之为 逗号表达式
d=(a+3,b*4) //逗号表达式
d=((a+3,b*4),a+b) //嵌套
求值的过程:
分别求每个表达式的值(从左到右依次执行),最后一个子表达式的值作为整个表达式的值返回
特别:for(int i=0,b=3;i<4;i++,j--)
#pragma mark 排序
void sort_list(PNODE pHead)
{
int i, j;
PNODE p, q;
for (i = 0, p = pHead->pNext; i<length_list(pHead)-1; i++, p = p->pNext) {
for (j = i+1, q = p->pNext; j<length_list(pHead); j++, q = q->pNext) {
if (p->date>=q->date) {
int temp ;
temp = p->date;
p->date = q->date;
q->date = temp;
}
八,关系运算符
一)条件判断
默认情况下。在程序中写出的每一句正确的代码都会被执行,但很多时候我们需要在某个条件成立的情形下才执行某一段代码,如登录操作,这种情况可以使用条件语句来完成。
(二)真假
在C语言中,条件成立称为“真”,条件不成立称为“假”。
C语言规定,任何数值都有真假性,任何非零值都为真,只有0才为假,无布尔类型。
(三)关系比较
关系运算的结果只有两种情况,如果条件成立就为真,值为1,如果条件不成立就为假,值为0。有6种运算符,分别是:(1)< (2)<= (3) > (4) >= (5)== (6)!=
九,逻辑运算符
逻辑运算的结果只有两个:真(0)和假(1)
①. 与 && 条件1&&条件2 只有的那个条件1和条件2都成立时,才为真否则为假。
②. 或 || 条件1 ||条件2 当条件1或条件2中有一个成立时就为真,都不成立时为假。
③. 非 ! !条件 取反
注意:逻辑运算符在进行运算时,只要能够确定整体的真假性,后面的条件就不再进行而是直接忽略。
Int a=b=10;
Int c=(a>5)&&(++b>=11);//此时a==10,b==11,c==1
Int c=(a<5)&&(++b>=11);//此时a==10,b==10,c==0
提示:在进行逻辑运算时,如果搞不清楚各个符号的优先级,可以使用()。
逻辑短路
int x, y, z; x = y = z = 0; ++x || ++y && ++z 执行后y的值
因为&&的运算符优先级高于||,所以会先结合,但并没有计算,因为++x表达式为1,||后面的表达
式就不会参与运算了;
注意:逻辑短路问题:
// 逻辑与的 短路问题
// b 已经是0,结果一定是0 所以,后面的 (c=b+5,c++) 不执行了
//result = b && (c=b+5,c++); // 0 0
// 逻辑或的短路问题
// 2 a是2为真(满足一真为真),|| 后面的不执行了
//result = a || (c=b+5,c++);
十, 条件表达式
格式: 表达式1 ? 表达式2 :表达式3;
要求比较a和b的值,把数值大的存入到c中 c=a>b?a:b
比较a,b,c三个数的值,把最大的值存入到d中
Int abmax=(a>b)?a:b;
d=abmax>c:abmax:c;