当前位置: 首页 > article >正文

c/c++ *和后置++的优先级

        有时不记得c/c++里运算符的优先级,最简单的办法就是写一个测试程序,这样更能直接地了解,如下面这个简单的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
	int a[] = {1, 3, 5, 7};
	int *p = a;
	printf("*p++ = %d\n", *p++);
	
	printf("%d, %d, %d, %d\n", a[0], a[1], a[2], a[3]);
	
	return 0;
}

我看到网上有人说这个 *p++ 中 * 优先级比较高,说是先解引用了,再把指针++,真是这样的吗?我们先看运行结果:

这样看似乎看不出来,我们换一种方式,如果按上面的说法,*优先级高于++,那应该等价于(*p)++ 对不对,我们可以尝试下面这样的方法来验证一下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int array[] = {1, 3, 5, 7};
	int *p = array;

	printf("*p++ = %d\n", *p++);
	printf("*p = %d\n", *p);

    return 0;
}

 

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int array[] = {1, 3, 5, 7};
	int *p = array;

	printf("*p++ = %d\n", (*p)++);
	printf("*p = %d\n", *p);

    return 0;
}

两个代码片段,如果说 * 优先级高于后置++ 的话,那么 *p++ 和 (*p)++ 应该是等价的,那么结果应该是一样的:

实际结果是不一样的,其实我们分析一下可以得出后置++优先级高于*,分析如下:*p++ 先计算了p++,然后再解引用,因为后置++在当前情况下可视为不变的,等你再用它的时候它才是+1后的结果,所以添加了 printf("*p = %d\n", *p); 这一行,这里取的就是p++后的结果,此时它是指向了array[1], 所以输出是 3;而 (*p)++ 是解引用后再++了,是 array[0]+1 = 1 + 1 = 2 了。所以 *p++ 和 *(p++) 是一样的。

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int array[] = {1, 3, 5, 7};
	int *p = array;

	printf("*p++ = %d\n", *(p++));
	printf("*p = %d\n", *p);

    return 0;
}


http://www.kler.cn/a/303810.html

相关文章:

  • C/C++语言基础--C++模板与元编程系列六,C++元编程相关库的讲解与使用
  • 408模拟卷较难题(无分类)
  • elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明
  • 【Webpack实用指南】如何拆分CSS资源(2)
  • vue3+element-plus==> el-form输入响应式失效踩坑!!!!!!!!!!
  • LeetCode【0031】下一个排列
  • YOLOv8+Deepsort+PyQt+GUI 语义分割+目标检测+姿态识别 三者合一(集成于一套系统)综合视觉分析系统
  • 数据库设计中的需求分析
  • TCPIP网络编程(尹圣雨)UDP 轮流收发消息(windows)
  • CSS 新特性查漏补缺,快来看看你用过几个?
  • C#使用TCP-S7协议读写西门子PLC(一)
  • SAM 2:分割图像和视频中的任何内容
  • ERP进销存多仓库管理系统源码 带完整的安装代码包以及搭建部署教程
  • Unity Timeline
  • HTTP 协议和 APACHE 服务
  • 零基础国产GD32单片机编程入门(二十五)USB口介绍及CDC类虚拟串口通讯详解及源码
  • 【深入浅出Redis】Redis常见问题以及解决方案,可用于面试
  • RK_android8.1在设置中去掉Bluetooth功能
  • 学习笔记 - 知识图谱的符号表示方法
  • Python去除图片中的白色像素点背景
  • David Baker 任科学顾问,初创公司发布世界最大蛋白质相互作用数据库,已获 8 轮融资
  • WPS如何删除表格下的空白页
  • 常见的站长工具接口有哪些?站长们该如何选择?
  • uniapp child.onFieldChange is not a function
  • Android Studio 安装配置教程(Windows最详细版)
  • uview-plus 表单校验 相关字段有数据有值的情况下非空验证失败问题