【C语言】操作符详解(二)

简介: 【C语言】操作符详解(二)

单目操作符

单目操作符的介绍

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

代码演示:

#include<stdio.h>
int main()
{
  int a = -20;
  int* p = NULL;
  printf("%d\n", !2);
  printf("%d\n", !0);
  a = -a;
  p = &a;
  printf("%d\n", sizeof(a));
  printf("%d\n", sizeof(int));
  printf("%d\n", sizeof a);
  //printf("%d\n", sizeof int);//error
  printf("%p\n", p);
  return 0;
}

由此可以看出当sizeof计算字符的大小是可以直接在括号里面写声明的类型,也可以不用括号直接在后面写变量名。

sizeof和数组

下面是代码演示:

计算数组的大小

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

为什么test1和test2函数打印的大小都是4呢?

因为传递过去的是一直指针,指针的大小和类型没有任何的关系,只和使用的编译器有关,如果是32位那么输出的就是4个字节,要是64位的输出就是8个字节。

++和–的运算

下面是代码演示:

#include<stdio.h>
int main()
{
  int a = 3;
  int b = 4;
  printf("没有改变前a,b\n");
  printf("a=%d b=%d\n", a, b);
  int c = a++;
  int d = ++b;
  printf("改变后的a,b\n");
  printf("a=%d b=%d\n", a, b);
  printf("c=%d d=%d", c, d);
  return 0;
}

从这里可以看出来:

  • 当++在后面的时候是先赋值后自增;
  • 当++在前面的时候是先自增后赋值。
  • 当然–也和++一样的,在这里就不重复举例了。

关系操作符

>       大于
>=    大于等于
<   小于
<=    小于等于
!=      判断不相等
==      判断相等
#include<stdio.h>
int main()
{
  int a = 4;
  int b = 5;
  int c = 4;
  if (a!=b)
  {
    printf("呵呵\n");
  }
  if (a == c)
  {
    printf("haha\n");
  }
  if (a<b)
  {
    printf("你好\n");
  }
  return 0;
}

这里用if语句判断条件来举例了一些关系操作符,当条件满足的时候进入if。

在编程的过程中== 和=不小心写错,导致的错误。

逻辑操作符

&&     逻辑与
||     逻辑或

使用&&逻辑与时要条件都满足

使用||逻辑或时只要满足任何一个条件都可以

代码如下:

#include <stdio.h>
int main()
{
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}

结果为什么是这个呢?

因为a++后面跟着一个&&符号当a=0是后面的表达式就不需要计算了;

条件操作符

条件操作符也叫三目操作符

语法:

exp1 ? exp2 : exp3

比较两个数的大小

使用循环的代码如下:

#include <stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  if (a>b)
  {
    printf("a=%d", a);
  }
  else
  {
    printf("b=%d", b);
  }
  return 0;
}

我们还有没有更加简单的方法呢?答案是有的只需要一句话就可以解决,那就是条件操作符。

代码如下:

#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  int m = (a > b ? a : b);
  printf("%d\n", m);
  return 0;
}

这样可以达到效果,而且代码看起来更加的少。

逗号表达式

语法:

exp1, exp2, exp3, …expN
  • 逗号表达式,就是用逗号隔开的多个表达式。
  • 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
  • 代码如下:
#include<stdio.h>
int main()
{
  int a = 3;
  int b = 5;
  int c = (a > b, a++, b--, a + b);
  printf("c=%d", c);
  return 0;
}

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

[]下标引用操作符

操作数:数组名和索引值

#include<stdio.h>
int main()
{
  int arr[10] = { 0 };
  for (int i = 0; i < 10; i++)
  {
    arr[i] = i;
  }
  printf("%d\n", arr[7]);
  return 0;
}

可以看出[]的两个操作数是arr和7

()函数调用操作符

  • 至少有一个操作数;
  • 第一个操作数是函数名,其他的操作数是参数;
#include<stdio.h>
void test()
{
  printf("haha\n");
}
void test1(int arr[], int a)
{
  for (int i = 0; i < a; i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");
}
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  test();
  test1(arr, 10);
  return 0;
}

访问一个结构体的成员

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

使用.访问结构体成员

#include<stdio.h>
struct Sut
{
  char name[10];
  int age;
  char sex[5];
  double score;
};
int main()
{
  struct Sut s1 = {"汤姆",25,"男",89.5};
  struct Sut s2 = { "杰瑞",24,"男",90.5 };
  printf("%s %d %s %.1lf\n", s1.name, s1.age, s1.sex, s1.score);
  printf("%s %d %s %.1lf\n", s2.name, s2.age, s2.sex, s2.score);
  return 0;
}

使用->访问结构体成员

#include<stdio.h>
struct Sut
{
  char name[10];
  int age;
  char sex[5];
  double score;
};
void Print(struct Sut* p)
{
  //printf("%s %d %s %.1lf\n", (*p).name, (*p).age, (*p).sex, (*p).score);
  printf("%s %d %s %.1lf\n", p->name,p->age,p->sex,p->score);
}
int main()
{
  struct Sut s1 = { "汤姆",25,"男",89.5 };
  struct Sut s2 = { "杰瑞",24,"男",90.5 };
  Print(&s1);
  Print(&s2);
  return 0;
}


相关文章
|
23天前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
|
23天前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
|
1月前
|
C语言
C语言操作符(补充+面试)
C语言操作符(补充+面试)
30 6
|
30天前
|
存储 编译器 C语言
十一:《初学C语言》— 操作符详解(上)
【8月更文挑战第12天】本篇文章讲解了二进制与非二进制的转换;原码反码和补码;移位操作符及位操作符,并附上多个教学代码及代码练习示例
42 0
十一:《初学C语言》—  操作符详解(上)
|
2月前
|
C语言
五:《初学C语言》— 操作符
本篇文章主要讲解了关系操作符和逻辑操作符并附上了多个代码示例
32 1
五:《初学C语言》—  操作符
|
3月前
|
C语言
C语言逻辑操作符的短路问题
C语言逻辑操作符的短路问题
|
3月前
|
编译器 C语言
【C语言】:中移位操作符,位操作符详运算规则详解
【C语言】:中移位操作符,位操作符详运算规则详解
27 1
|
3月前
|
存储 编译器 C语言
|
3月前
|
存储 C语言 索引
【C语言基础】:操作符详解(二)
【C语言基础】:操作符详解(二)
|
3月前
|
编译器 C语言
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
C语言学习记录——操作符详解知识点选记(算术操作符、单目操作符、移位操作符、关系操作符、逻辑操作符、条件操作符......)二
38 3