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语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...
随机推荐
- 函数计算: 让小程序开发进入 Serverless 时代
点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 吴天龙(木吴 ...
- B树?这篇文章彻底看懂了!
前言 索引,相信大多数人已经相当熟悉了,很多人都知道 MySQL 的索引主要以 B+ 树为主,但是要问到为什么用 B+ 树,恐怕很少有人能把前因后果讲述完整.本文就来从头到尾介绍下数据库的索引. 索引 ...
- CCF-CSP题解 201903-4 消息传递接口
求并行的各个进程,且进程内部顺序执行的情况下,会不会出现"死锁". 首先用\(%[^\n]\)将每个进程读入.最后过不了居然是因为\(str[\ ]\)开小了(悲喜交加.存储在\( ...
- git常用操作合集
基本操作git status 查看文件处于什么状态 git status -s 带上-s参数,可以以更紧凑的格式输出文件状态信息 git add 开始追踪该文件或者暂存已修改的文件. .gitigno ...
- C# 生成全球唯一标识符GUID
string strguid = Guid.NewGuid().ToString();//57d99d89-caab-482a-a0e9-a0a803eed3ba 生成标准的标志符 (36位标准)st ...
- CAD绘图效率低?教你4个CAD绘图技巧,绘图效率提升十倍
CAD绘图一直是一个谜一样的存在,说它简单吧,很多人都无法完全精通,说它难吧,很多人也都自学成才了. 如何学好CAD绘图是个难题,但是老话说的好,只要思想不滑坡,办法总比困难多,掌握以下这些CAD绘图 ...
- 松软科技Web课堂:JavaScript 正则表达式
正则表达式是构成搜索模式的字符序列. 该搜索模式可用于文本搜索和文本替换操作. 什么是正则表达式? 正则表达式是构成搜索模式(search pattern)的字符序列. 当您搜索文本中的数据时,您可使 ...
- ORACLE各种对象、概念及关系整理(一文读懂)
下面是我整理(抄袭)的一些Oracle数据库相关概念对象的理解,如有疏漏,欢迎指正.至于整理这篇文章的目的:主要是网上的内容太散了,这样整理一遍可以加深理解,也便于后续查阅.就我的理解:下述内容应该可 ...
- Linux重要的服务讲述(1)
NFS 概述 NFS(Network File System)即网络文件系统,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS ...
- https的原理
https目的是为了防止第三方截获信息,原理是使用非对称加密和数字证书认证传输密钥建立连接,使用密钥对称加密信息进行通讯. https建立连接的过程: 数字证书原理: