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语言运算的掌握程度啊!)

时间: 2024-10-20 02:30:52

C语言一个细节地方的说明【防止使用不当而出错】的相关文章

我在小学和中学里都遇到了很好的老师(背诵很重要,做事要规范,习惯很重要,习惯是靠平时每一个细节重复出来的)

我在小学和中学里都遇到了很好的老师,现在回想起来,对我帮助最大的地方有下面几点. 一,养成了作检查的习惯.我小学四年级的时候,遇到了一位极好的数学老师.那时候刚刚学习多位数乘法,很容易算错的.他教给我们用同余的原理,分别计算两个乘数和结果除9的余数,用来验算结果.方法很简单,也实际提高了考试的分数,但最使我受益终身的是,从此养成了进行验算的习惯,这在后来的学习和工作中对我的帮助极大.通常在得出一个结果之后,特别是经过复杂推导和计算才得出的,我都会试着另用某种近似的办法重新估算一次,作为验证. 二

packetdrill框架点滴剖析以及TCP重传的一个细节

本来周末想搞一下scapy呢,一个python写的交互式数据包编辑注入框架,功能异常强大.然而由于python水平太水,对库的掌握程度完全达不到信手拈来的水平,再加上前些天pending的关于OpenVPN的事情,还有一系列关于虚拟网卡的事情,使我注意到了一个很好用的packetdrill,可以完成本应该由scapy完成的事,恰巧这个东西跟我最近的工作也有关系,就抛弃scapy了,稍微研究了一下它的基本框架,写下本文. packetdrill的框架概览 喜欢packetdrill是因为它让我想起

android创建一个细节页面,以及argument的应用

大家好..以前我也好奇过有没有一些设计模式可以用来创建一个细节页面,直到最近我看了一些设计模式相关的博文和书后,我终于发现了以下的应用. 下面我们介绍一个Listview 点击后出现一个detail 页面的功能,功能简单,但是我们看的是思想. 首先我们实现自定义的ListView,ListItem 里面有一个TextView,一个EditText,一个Checkbox,对应存放数据的是一个Crime的类.ListView里面有好多个ListItem,而对应的是CrimeList 类,为了方便创建

【JOB】Oracle中JOB的创建方法以及一个细节的探究

在Oracle中可以使用JOB来实现一些任务的自动化执行,类似于UNIX操作系统crontab命令的功能.简单演示一下,供参考. 1.创建表T,包含一个X字段,定义为日期类型,方便后面的定时任务测试.[email protected]ora10g> create table t (x date); Table created. 2.创建存储过程p_insert_into_t,每次执行该存储过程都会向T表中插入一条系统当前时间.[email protected]ora10g> create or

onCreateView的一个细节--Fragment

public View onCreateView(LayoutInflater inflater, ViewGroup contaiiner, Bundle savedInstanceState) 在写一个Fragment的时候,继承Fragment基类,然后,要重写的其中一个回调方法是onCreateView.如果该Fragment有界面,那么,返回的View是非空的:如果该Fragment 是没有界面的,返回的是Null. 这是在写Fragment中经常做的事情.不过,这里有个小细节,那就是

一个细节可能使游戏毙命

让玩家讨厌一款游戏的原因有很多,通常,玩家总是说,这不是一款好游戏.有时候,你自认为自己创造出了一款出色的游戏,殊不知一些很小的细节上的缺陷不但会破坏一些玩家爱的游戏体验,而且可能会让他们真正的走向愤怒. 在笔者最喜欢的十款游戏中,<荒野大镖客:救赎>一直处于前三名的位置,2010年,我第一次接触这款游戏的时候,有一个瞬间差点让我流失了. 玩过这款游戏的人可能知道,其中有一个主人公骑着马穿过河流来到墨西哥的情节,这事你会听到一首经典的歌曲,Jose Gonzalez的Far Away这是一个十

关于Linux LOOPBACK网口抓包的一个细节

这个问题其实是我几个月前碰到,只是那时好像还在回忆着什么,心系上海,还没有完全适应这个新环境,加上这个问题也不是什么太深奥的问题,觉得太简单了,就搁置了.今天周末闲来无事就顺便写来来了.加上深圳经常下雨,越来越喜欢了. 本文没什么深度,仅为记录,以及阐述一个"看文档学习原理->猜测并自行实现->对比标准实现确认"的方法. 问题是这样的:在Linux上如果使用tcpdump去抓取lo口的数据包,你只能抓到一遍,而不是两遍,按常理来讲,数据包在outgoing路径上和incom

关于ios下字体描边的一个细节

转载请注明,来自:http://blog.csdn.net/skyman_2001 CGContextSetTextDrawingMode(context, kCGTextStroke); CGContextSetRGBStrokeColor(context, pInfo->strokeColorR, pInfo->strokeColorG, pInfo->strokeColorB, 1); CGContextSetLineWidth(context, pInfo->strokeS

hashMap源码中的一个细节问题

public V put(K key, V value) {        if (key == null)           return putForNullKey(value);        int hash = hash(key.hashCode());         int i = indexFor(hash, table.length);        for (Entry<K,V> e = table[i]; e != null; e = e.next) {