C语言中的顺序点
C语言盲点
1.函数参数的求值顺序依赖于编译器,例如f(a,a++);是先求a++还是求a不一定
2.C语言中的大多数运算符对其操作数的求值顺序也依赖于编译器
警告
int i = f() * g();这里先求f()还是先求g()不一定,所以不能写出要先实现f(),在实现g()的函数;
程序中的顺序点
定义:
指程序执行过程中修改变量值的最晚时刻。
有哪些顺序点
1.每个完整表达式结束后,即分号后面
2.&&,||,三木运算符(?:),以及逗号表达式的每一个运算对象计算之后
3.函数调用中对所有实际参数的求值完成之后(进入函数体之前)
考虑以下代码输出值
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int k = 2;
int a = 1;
k = k++ + k++;
printf("k = %d\n",k);
if(a--&&a)
{
printf("a = %d\n",a);
}
system("PAUSE");
return 0;
}
分析:
1.k = k++ + k++;的顺序点在‘ ; ’后,所以k++到真正去修改内存值是在分号后面,所以编译器的行为是先k =2+2;之后k自增两次
2.在遇到&&时候,每一个运算对象之后就是一个顺序点所以a–执行后就是一个顺序点,所以这是就去内存修改了a的值,所以就是if(1&&0)所以不执行printf
再考虑以下代码
#include <stdio.h>
#include <stdlib.h>
int f(int i, int j)
{
printf("%d, %d\n", i, j);
}
int main(int argc, char *argv[])
{
int k = 1;
f(k, k++);
printf("%d\n", k);
system("PAUSE");
return 0;
}
输出结果
//2,1
//2
也就是 i =2,j = 1, k = 2
之前提到实参在传入函数之前对实参的求值完成之后是一个顺序点,也就是在进行值传递的时候K已经是2了,
C语言中的顺序点的更多相关文章
- c语言中函数参数入栈的顺序是什么?为什么
看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){ ...
- C语言中的栈和堆
原文出处<http://blog.csdn.net/xiayufeng520/article/details/45956305#t0> 栈内存由编译器分配和释放,堆内存由程序分配和释放. ...
- Java C# C语言中的占位符
一般拼接一段字符串在编程中是很常见的事,下面简单做个总结: 什么是占位符?占位符就是先占住一个固定的位置,等着你再往里面添加内容的符号. 1.Java中处理方法: package com.amos; ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- C语言中 *.c和*.h文件的区别!
C语言中 *.c和*.h文件的区别! http://blog.163.com/jiaoruijun07@126/blog/static/68943278201042064246409/ ...
- C语言中的内存压缩技术
C语言中的内存压缩技术 前言 在整个研究生阶段我都在参与一个LTE协议栈实现的项目,在这个项目中,我们利用一个自己编写的有限状态机框架将协议栈中每一层实现为一个内核模块.我们知道,在编写内核代码时需要 ...
- C语言中结构体对齐问题
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...
- C语言中内存分配 (转)
在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...
- 《C语言深度剖析》学习笔记----C语言中的符号
本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...
随机推荐
- CSS 计数器详解
在前端开发中总少不了列表项,对于列表项序号,射鸡师一般会列出个1,2,3...序号.在不了解css计数器属性之前,我一般会用精灵图,用类名来区分序列号图片.这样做尽管可以达到目的,但是很不方便,开发过 ...
- React: 研究Redux的使用
一.简介 在上一篇文章中,大概讲了下Flux设计模式的使用,在末尾顺便提了一些基于Flux的脚本库,其中Redux已经毋庸置疑地成为了众多脚本库的翘楚之一.是的,Redux是基于Flux开发的,Red ...
- Golang 入门系列(十二)ORM框架gorm
之前在已经介绍了用的github.com/go-sql-driver/mysql 访问数据库,不太了解的可以看看之前的文章 https://www.cnblogs.com/zhangweizhong/ ...
- 升鲜宝V2.0_生鲜配送管理系统_杭州生鲜配送行业,升鲜宝使用教程 客户管理 第二章
1.新增客户 (1)新增客户有两种方式,单个添加和批量添加,客户的结构可以是独立的,也可以是父子结构(比如杭州升鲜宝科技有限公司下有西湖区部门,滨江区部门,余杭区部门等多个分部,就可以建立父子结构,这 ...
- 使用 SQL 服务器时,"评估期已过期"错误消息
当打开sql server2008企业管理器的时候,出现报错“评估期已过.有关如何升级的测试版软件的信息.....” 修改注册表:HKEY_LOCAL_MACHINE/SOFTWARE/Microso ...
- Hadoop_MapReduce_03
1. MapReduce入门 1.1 MapReduce的思想 MapReduce的思想核心是"分而治之" , 适用于大量的复杂的任务处理场景 (大规模数据处理场景) . Map负 ...
- https的原理
https目的是为了防止第三方截获信息,原理是使用非对称加密和数字证书认证传输密钥建立连接,使用密钥对称加密信息进行通讯. https建立连接的过程: 数字证书原理:
- 非常详细的 (VMware安装Centos7超详细过程)
本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:Ce ...
- python3数据分析,安装学习
python3数据分析,安装学习 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-09-26. 为了简单.安装 anaconda3 就好啦. 因为安装原版python3,用pip安装 ...
- 基于STM32的无损压缩算法miniLZO移植,压缩率很高,20KB随机数压缩到638字节,耗时275us
说明: 1.miniLZO是采用C编写的无损压缩库. 2.提供了快速压缩和超快速解压缩能力. 3.比较耗内存,需要64KB内存用于压缩,对于H7这种大内存的,非常合适.或者有外置SRAM/SDRAM的 ...