C语言一个细节地方的说明【防止使用不当而出错】
1.运行如下的代码:
#include <stdio.h>
#include <string.h> int main()
{
int a;
a=1;
int s[4]; memset(s, 0, sizeof(s));
s[a++]=a++;
printf("s[0]=%d\n", s[0]);
printf("s[1]=%d\n", s[1]);
printf("s[2]=%d\n", s[2]);
printf("s[3]=%d\n", s[3]);
printf("a = %d\n\n\n", a); a=1; memset(s, 0, sizeof(s));
s[a++]=++a;
printf("s[0]=%d\n", s[0]);
printf("s[1]=%d\n", s[1]);
printf("s[2]=%d\n", s[2]);
printf("s[3]=%d\n", s[3]);
printf("a = %d\n\n\n", a); a=1; memset(s, 0, sizeof(s));
s[++a]=a++;
printf("s[0]=%d\n", s[0]);
printf("s[1]=%d\n", s[1]);
printf("s[2]=%d\n", s[2]);
printf("s[3]=%d\n", s[3]);
printf("a = %d\n\n\n", a); a=1; memset(s, 0, sizeof(s));
s[++a]=++a;
printf("s[0]=%d\n", s[0]);
printf("s[1]=%d\n", s[1]);
printf("s[2]=%d\n", s[2]);
printf("s[3]=%d\n", s[3]);
printf("a = %d\n\n", a);
return 0;
}
输出结果为:
s[0]=0
s[1]=1
s[2]=0
s[3]=0
a = 3
说明:a=1; s[a++]=a++;
a++会先使用a的值,再进行计算。先进行了这样的赋值s[1]=1; 然后又进行了两次a++的运算,所以a=3。
s[0]=0
s[1]=0
s[2]=2
s[3]=0
a = 3
说明:a=1; s[a++]=++a;
先进行一次++a, a=2。然后进行了s[2]=2; 再进行一次a++,最后还是a=3。
s[0]=0
s[1]=0
s[2]=2
s[3]=0
a = 3
说明:a=1; s[++a]=a++;
先进行一次++a, a=2。 再进行s[2]=2; 最后进行a++, 最后a=3;
s[0]=0
s[1]=0
s[2]=0
s[3]=3
a = 3
说明: 先进行两次++a, a=3; 再进行s[3]=3;
总结:在上面的这种带增量运算的式子中,在进行赋值运算前,先把所有的++x;的这种运算做完,保存好此时的变量值。在进行赋值运算。
赋值运算做完后,再进行x++;的这种增量运算式子。 这样就可以解释上面的所有运行结果了。
(PS:完全可以用上面的代码的运行结果来考察一个人对C语言运算的掌握程度啊!)
C语言一个细节地方的说明【防止使用不当而出错】的更多相关文章
- Luogu3163 [CQOI2014]危桥 ---- 网络流 及 一个细节的解释
Luogu3163 [CQOI2014]危桥 题意 有$n$个点和$m$条边,有些边可以无限次数的走,有些边这辈子只能走两次,给定两个起点和终点$a_1 --> a_2$(起点 --> 终 ...
- Protoc Buffer 优化传输大小的一个细节
Protoc Buffer 是我们比较常用的序列化框架,Protocol Buffer 序列化后的占空间小,传输高效,可以在不同编程语言以及平台之间传输.今天这篇文章主要介绍 Protocol Buf ...
- 【JOB】Oracle中JOB的创建方法以及一个细节的探究
在Oracle中可以使用JOB来实现一些任务的自动化执行,类似于UNIX操作系统crontab命令的功能.简单演示一下,供参考. 1.创建表T,包含一个X字段,定义为日期类型,方便后面的定时任务测试. ...
- IOS 从一个小地方想到……
//(一个比较好的地方是 : cancel代表取消的意思,suspended,表示已经挂起,这些英文记住了用来命名挺好的,看看别人的过去时都是加ed的,就是这么强,所以语法不好的话,多关注ios的命名 ...
- java比.net优美的一个小地方
用了四年的.net,今年转做java,内心一直吐槽java的烦琐,今天发现了一个java值得我为之点赞的地方 java的枚举居然可以这么玩,废话不多,上demo package com.sunline ...
- 读《锋利的jQuery》中first-child时的一个细节
今天在看<锋利的jQuery>这书时,看到过滤选择器那一节.有个知识点引起了我的注意. (我不用书里一模一样的代码做例子)举个简单的例子-代码: <ul> <li> ...
- 关于eclipse open call hierarchy功能的一个细节
这个功能对应的快捷键是ctrl alt H,大家应该都很熟悉了.默认是查找这个方法的被调用堆栈.90%的人应该也是习惯这个默认的功能的,也基本无视它的另一个功能. 昨天重启eclipe之后,我的ecl ...
- java Integer包装类装箱的一个细节
原文:https://www.cnblogs.com/JackPn/p/9392145.html java有八个基本数据类型,每个都有对应的一个包装类,比如int对应的Integer.从jdk1.5开 ...
- onCreateView的一个细节--Fragment
public View onCreateView(LayoutInflater inflater, ViewGroup contaiiner, Bundle savedInstanceState) 在 ...
随机推荐
- 从外部访问 Template (模板)的控件、获取它的属性值
DataTemplate 和 ControlTemplate 两个类均派生自 FrameWorkTemplate类.这个类有个 FindName方法 供我们查询内部控件. ControlTempla ...
- c/c++输入处理,制定变量参数和值
void usage(char* s){ fprintf(stderr, "\n"); fprintf(stderr, "%s -s <source file> ...
- 转载:tar 解压缩命令~
转载自:http://blog.csdn.net/dunyanan1/article/details/38869059tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文 ...
- orm查询基本操作
orm ----关系对象模型 orm 的查询两种操作 1.基于对象的查询 oneTo one 一对多 和多对多 对象.关联字段 对象.表名(_set)) 2.基于QUERYset的查询 双下划线即为 ...
- 第9章 Docker Swarm 相关问题
9.1 我的 Docker 版本是 1.12,请问我跑的是一代 Swarm 还是二代 Swarm 啊? ……自己运行的 Swarm 怎么会连自己都不知道跑的是啥?
- python3 - 动态添加属性以及方法
给实例动态添加方法,需引入types模块,用其的MethodType(要绑定的方法名,实例对象)来进行绑定:给类绑定属性和方法,可以通过 实例名.方法名(属性名) = 方法名(属性值) 来进行绑定.给 ...
- 免安装mysql配置
1.下载压缩包:去官网下载免安装的MySQL的压缩包http://dev.mysql.com/downloads/mysql/根据机器选择64位或者32位: 2.解压到相应目录.我解压到了D:\Pro ...
- iPhone SDK中多线程的使用方法以及注意事项
多线程iphonethreadapplication编程嵌入式 然现在大部分PC应用程序都支持多线程/多任务的开发方式,但是在iPhone上,Apple并不推荐使用多线程的编程方式.但是多线程编程毕竟 ...
- 关于java后台如何接收xml格式的数据
业务场景:用户发送下单请求,格式为xml格式,服务器接收数据完成下单,并返回结果给客户. 请求格式: <request> <head> <sign></sig ...
- activity通过流程实例id动态获取流程图并展示在jsp页面上
提供的Service方法如下: Java /** * 获取当前任务流程图 * * @param processInstanceId * @return */ @Override public Inpu ...