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) 在 ...
随机推荐
- HDU2844 Coins 多重背包
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 字符设备驱动程序--LED驱动
编写驱动程序需要编写那些代码: 1.硬件相关的驱动程序 2.Makefile的编译程序 3.还需要编写一个相关的测试程序 比如说:一个摄像头驱动程序 1.驱动程序的编写,需要编写一些硬件相关的操作,编 ...
- VS2012如何显示行号
Tools-Options-Text Editor-All Languages –General – Display
- IOS开发复习笔记(3)-ARC
1.ARC 当你自己调用了release或retain语句的时候,ARC有效时编译文件会遇到错误,你可以通过-fno-objc-arc和-fobjc-arc两个编译器标志在混搭中支持ARC和非ARC的 ...
- log日志框架和LocationAwareLogger问题
遇到了同样的问题, 我的解决办法是在pom.xml中增加如下配置,去除对于jcl-over-slf4j.jar的依赖. <exclusions> <ex ...
- Python:itertools模块(转)
原文:http://www.cnblogs.com/cython/articles/2169009.html itertools模块包含很多创建迭代器的函数,可以用各种方式对数据进行循环操作,此模块中 ...
- postgrSQL 错误ERROR: permission denied
赋权限: GRANT ALL PRIVILEGES ON TABLE 表名 TO 用户;
- Android 4.4 Kitkat 音频实现及简要分析
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jingxia2008/article/details/26701899 在 Android 4.4 ...
- 008-ThreadLocal
一.基本用法 ThreadLocal是一个容器,用于存放线程的局部变量.如果ThreadLocalVariable(线程局部变量)更加好理解. 在Jdk 1.2 java.lang.ThreadLoc ...
- ABAP开发中message dump
系统里边 消息 造成dump示例, 1.面向对象的method 中一般不能用stop, 例如data_change事件, ** sm30 不能stop, 2. 增强中 有些地方不能stop, 3.还有 ...