在此记录一些常见的C语言错误,可以当作学习C语言的笔记,需要的时候可以回过头看看。

1.关于“++”

#include
int main()
{
int a,b,cd;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
return 0;
}

关于自加自减运算符用于句话就可以总结:a++先使用后自加,++a先自加再引用。这样就可以轻松得出结果:

edsionte@edsionte-laptop:~/code$ ./test
a=13 b=10 c=12 d=120

2.交换变量
第一种方法即中间变量法,下面说明第二种,不添加中间变量:

int a=1,b=2;
a=a+b;
b=a-b;
a=a-b;

3.char* str=”hello world”; sizeof(str)=12,strlen(str)=11.因为strlen函数求字符串长度时不包含字符串末尾的’\0’。

4.char a[10];int len=strlen(a); len其实不等于10,应该注意strlen求的是从字符串第一个元素到‘\0’之间字符总数(不包含‘\0’),而此数组未初始化。尽管语法上是正确的,但是用法错误。如果换作sizeof(a),结果便是10。

5.int(*s[10])(int) 表示什么?

这个语句看起来很复杂,不过我们一步步来分析。首先s[10]是一个数组,*s[10]说明他的元素是指针。那种类型的指针呢?整体来看这个语句:int(*)(int),不用多说是函数指针。那么进一步说就是,s[10]是一个有10个元素的指针数组,每个元素都指向一个函数,并且这个函数有一个int参数,并且返回int型的值。这样看好像很麻烦,不久是一个指针数组吗,何必这么麻烦。为了好理解,我们可以这么看:int(*)(int)  s[10]。

类似的对于数组指针,我们也可以这么理解,以便加深记忆。比如int (*s)[10];s是一个指向数组的指针,这样定义一个指针说实话很难让人理解。那么我们不要被他这个样子而迷惑,那就这么理解吧:int (*)[10] s;这样很符合一般指针定义的规则。

6.如下语句:

char* dest=”hello,world”;

char* src=”hello”;

puts(strcpy(dest,src));

这样做是错误的,原始是因为dest指向字符串常量,不可修改其某个字符值。其实正确的写法应该是const char* dest=”hello,world”;但是一般情况下不加const编译的时候也不会出错。但是如果dest[2]=’a’;那么就会出错,即便这条语句合乎语法。如果 char a[100]; char* dest=a;因为数组中的元素是变量,可以修改,也就可成功打印。如果有下面语句:char str[100]=”hello,world”,这样写完全正确,因为只是用hello world初始化这个数组而已。

7.想要输入下面一段字符串:edsionte is a goog boy。用scanf函数是不行的。因为scanf函数以回车键和空格键作为字符串输入结束的标志。而gets函数则仅以回车键作为字符串输入的结束符。因此可以使用gets函数来接收含有空格键的字符串。

8.宏定义和预编译不属于c语言语句,因此不已;结尾。而结构体定义属于c语言语句,应该以分号结尾。

9.共用体内可以定义多个不同类型的成员变量 ,但是每次只能使用一个变量。即这些变量共同使用一段内存空间,这段内存空间的大小由这些变量中长度最长的变量决定。

10.对于int a[5]这个数组来说,a,&a,&a[0],a+1,&a+1,&a[0]+1各代表什么?

a:a是这个数组的名称,它代表数组首元素的首地址,也就是a[0]的首地址。

&a:是数组的首地址。注意如果打印a和&a的值,两者是一样的,但是意义不同。

&a[0]:a[0]的首地址,等价于a。

a+1:数组中下一个元素的地址,即a[1]的地址。

&a+1:这是一个指向下一个数组的指针,这个数组是一个长度为5的整型数组。

&a[0]+1:等价于a+1。

11.在一般的32位机当中,指针类型均为4个字节,即便这个指针指向一个字符,因为指针说到底还是地址。对于一个数组int a[10],那么sizeof(a)=10*4;但是如果p是一个指向此数组的指针,那么sizeof(p)就是4。

12.给一个指针加上一个整数与给该指针的二进制表示加上同样的整数含义是不同的。比如int a[10];int *p=a;那么p+1指向的是这个数组的第二个元素,并不是在a[0]元素的首地址上加1。

13.定义一个枚举类型的变量:

enum return_value
{
    RET_TURE;
    RET_FALSE;
    RET_RANDOM;
}

枚举类型中每一个枚举常量都是用标示符表示的整形常量。上述枚举类型中的各个枚举常量并未赋值,但是默认值依次为0,1,2。

C语言笔记本的更多相关文章

  1. Netflix 开源 Polynote:对标 Jupyter,一个笔记本运行多种语言

    谈到数据科学领域的开发工具,Jupyter 无疑是非常知名的一种.它具有灵活高效的特点,非常适合进行开发.调试.分享和教学.近日,Netflix(奈飞)居然也玩起了跨界,他们开源了一个名为 Polyn ...

  2. GeneXus笔记本—GeneXusIDE如何切换成中文语言

    嘛 有些人可能比较习惯英文IDE,但是有些人就比较难受 所以为了应对各个地区的差异 GeneXus很人性化的自带了一部分国家的语言包 只不过默认是英文 需要改动一下_(:з」∠)_ 右键你的IDE快捷 ...

  3. C语言---volatile(我的工程笔记本)

    一般说来,volatile用在如下的几个地方: 1.中断服务程序中修改的供其它程序检测的变量需要加volatile: 2.多任务环境下各任务间共享的标志应该加volatile: 3.存储器映射的硬件寄 ...

  4. C语言---return(我的工程笔记本)

    迷惑了一天  函数就是输出有问题,进入函数设置密码的时候,当我保存密码准备返回,问题就在此时诞生了,界面是主界面,但功能函数还是没反应,设置序列号初始值的原来按键却还是有反应,莫名其妙,莫名其妙... ...

  5. C语言拾遗(一)

    越来越体会到C语言的重要性,不管是在计算机底层的理解上,还是在算法数据结构上,所以遂决定重新拾起C语言,不定期更新一些知识点. 推荐博客:http://blog.csdn.net/itcastcpp ...

  6. 笔记本win8,mac10.10,ubuntu,android四系统安装

    前言,最简单的是win8和ubuntu 最难啃的是mac android版只是要注意一个小技巧,目前算是独创 (被android坑了一次,两块硬件,android版把500Gntfs的硬盘整个识别为一 ...

  7. X86上搭建交叉工具链,来给龙芯笔记本编译本地工具链(未完待续)

    故事的背景是,我买了一台龙芯2F的笔记本来装B. 为什么说是装B呢?因为不但操作系统是Linux,而且CPU还是龙芯的. 一般人有这么酷的装备吗?简直是装B大圣啊. 这里一定要申明一点,本人不是IT技 ...

  8. 小试牛刀C#作为脚本语言执行解密

    背景 我们知道Unity3d是通过C#脚本语言的形式来实现游戏的逻辑代码编写,同样SCOTT服务器也设置了通过C#脚本来实现游戏逻辑,但是本文并不是想真正分析解密他们的运行机制,只是想通过自己的一个需 ...

  9. C语言的函数

    "函数"在英文的翻译是"function",无论在自然科学还是计算机科学都是这个词,而"function"的本意是"功能" ...

随机推荐

  1. layer和3D仿射变换

    1.视图的显示基于图层,通过控制图层同样能控制显示效果,获取当前的视图的layer,并为其增加圆角边框. //设置layer边框的宽度为2 view.layer.borderWidth=; //如果需 ...

  2. js移除Array中指定元素

    首先需要找到元素的下标: var array = [2, 5, 9]; var index = array.indexOf(5); 使用splice函数进行移除: if (index > -1) ...

  3. 【小程序】component使用

    component使用 组件模板 组件模板的写法与页面模板相同.组件模板与组件数据结合后生成的节点树,将被插入到组件的引用位置上. 在组件模板中可以提供一个 <slot> 节点,用于承载组 ...

  4. FrameWork逆向工程之MotioPI

    在BI项目建设的过程中我们一般都是有备份的,而且这个是必须有的!特别是例如ETL Model,还有Data Model这一类的元数据,这些东西如果我们没有备份,而恰好的我们的开发模型又在某一天离我们而 ...

  5. C++类型转换的经典例子

  6. JavaScript 与 PHP 的语法区别

    1. 基本类型 php的基本类型分别: .基本数据类型:整型.小数(float/double).字符串.布尔类型 .复合类型:数组.对象 .特殊类型:Null,资源类型 JavaScript的基本类型 ...

  7. linux下如何查看所有的用户和组信息?

    /etc/group  文件是用户组的配置文件. /etc/passwd 文件是用户的配置文件. 使用cat.more.less.head.tail以及vim等命令都可以查看.修改这两个配置文件. 说 ...

  8. core dump相关

    linux下生成core dump文件方法及设置 http://www.2cto.com/os/201310/253450.html 在linux平台下,设置core dump文件生成的方法:   1 ...

  9. 利用Session完成用户的登录和注销

    用户的登录和注销是最常见的Web应用案例,当一个应用的客户登录了以后,其他所有的会话都得知道这个用户已经登录还很有可能得提取用户的昵称予以显示等等,所以,只有把登录成功的用户的信息放入到Session ...

  10. window中findstr命令的用法

    http://www.netingcn.com/window-findstr-command.html findstr是window系统自带的命令,用途是查找指定的一个或多个文件文件中包含(或通过参数 ...