您的位置:首页 > 编程语言 > C语言/C++

C语言操作符和表达式

2018-03-29 22:31 239 查看

1.算数操作符

+
-
*
/     // 5 / 2 = 2
%     // 5 % 2 = 1


注:

1.除%操作符之外,其他的几个操作符均可作用与整数和浮点数,但需要注意结果打印的格式和精度缺失。

2.对于/操作符,如果两个数都为整数,执行整数除法,而只要有浮点数执行的就是浮点数除法。

3.%操作符的两个操作数必须为整数。返回的是整除之后的余数。

2.移位操作符

左移操作符 <<

移位规则:左边抛弃、右边补零

int num = 10;    //00000000000000000000000000001010  num在内存中的二进制
num = num >> 1;  //00000000000000000000000000010100  num左移一位的结果


右移操作符 >>

1.算数移位(常用)

移位规则:左边用原该值的符号位填充、右边丢弃

2.逻辑移位

移位规则:左边用0补充、右边丢弃

int num = -1;  //11111111111111111111111111111111  内存中-1的补码
//算数右移  11111111111111111111111111111111  左边用原该值的符号位填充
//逻辑右移  01111111111111111111111111111111  左边用0补充


3.位操作符

&    //按位与    两数补码同位比较,同为1为,其余为0
|    //按位或    两数补码同位比较,有1就取1,都为0才取0
^    //按位异或  两数补码同位比较,相同取0,不同取1


注:操作数必须是整数

#include <stdio.h>
int main()
{
int num1 = 1;   //00000000000000000000000000000001
int num2 = 2;   //00000000000000000000000000000010
num1&num2;      //00000000000000000000000000000000
num1|num2;      //00000000000000000000000000000011
num1^num2;      //00000000000000000000000000000011
}


例:求一个整数存储在内存中的二进制中1的个数

#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;    //计数
for (i = 0; i < 32; i++)
{
if (((num >> i) & 1) == 1)
count++;
}
printf("二进制中1的个数 = %d\n", count);
return0;
}


4.赋值

复合赋值符

+=
-=
*=
/=
%=
>>=
<<=
&=
|=


a += 1,即a = a + 1

5.单目操作符

!        //逻辑反操作    对非0的数反为0,对0取反为1
-         //负值
+         //正值
&         //取地址
sizeof    //操作数的类型长度(以字节为单位)
~         //对一个数的二进制按位取反
--        //前置、后置--
++        //前置、后置++
*         //间接访问操作符(解引用操作符)
(类型)    //强制类型转换


sizeof和数组

#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));    //4
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));    //4
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr));    //40
printf("%d\n", sizeof(ch));     //10
test1(arr);
test2(ch);
return 0;
}


++和- -运算符

前置++、- -

int a = 10;
int x = ++a;    //x = 11    先对a进行自增,然后使用a
int y = --a;    //y = 10    先对a进行自减,然后使用a


后置++、- -

int a = 10;
int x = a++;    //x = 10  a = 11  先使用a,然后对a进行自增
int y = a--;    //y = 11  a = 10  先使用a,然后对a进行自减


解引用操作符

int a = 10;
int p = &a;    //定义指针p
p = 20;        //解引用操作


6.关系操作符

>
>=
<
<=
!=    //用于测试“不相等”
==    //用于测试“相等”


注:在编程的过程中==和=写错,导致错误

7.逻辑操作符

&&    //逻辑与
||    //逻辑或


注:逻辑与中,一旦出现0,则为0,后面的不再计算

逻辑与和按位与、逻辑或和按位或

1&2 ------> 0
1&&2 -----> 1

1|2 ------>3
1||2 ----->1


8.条件操作符

exp1 ? exp2 : exp3

a > 5 ? b = 3 : b = -3


9.逗号表达式

exp1, exp2, exp3, ...expn


逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果

int a = 1;
int b = 2;
int c = (a > b, a = a+10, a, b = a + 1);    //逗号表达式


10.下标引用、函数调用和结构成员

1.[ ]

操作数:一个数组名 + 一个索引值

int arr[10];    //创建数组
arr[9] = 10;    //使用下标引用操作符
//[]的两个操作数是arr和9


2.( )

函数调用操作符

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数

#include <stdio.h>
void test1()
{
printf("哈哈\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1();            //使用()作为函数调用操作符
test2("hello");     //使用()作为函数调用操作符
return 0;
}


3.访问一个结构成员

.结构体.成员名

->结构体指针->成员名

struct Stu
{
char name[10];
int age;
}
int main()
{
struct Stu stu;
struct Stu* pStu = &stu;    //结构体成员访问
stu.age = 20;               //结构体成员访问
pStu->age = 20;             //结构体成员访问
return 0;
}


11.表达式求值

隐式类型转换

c的整型算数计算总是至少以缺省整型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通类型,这种转换被称为“整型提升”。

算术转换

寻常算术转换
long double
double
float
uunsiged long int
long int
unsigned int
int


如果某个操作数的类型在上面的列表中排名较低,那么首先要转换为另一个操作数的类型后执行运算。

float f = 3.14;
int num = f;    //隐式转换,会有精度丢失
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: