有下面非常经典的一个字符串复制程序。

  test1.c

 #include <stdio.h>
int main()
{
char str_t[]="This String comes from t";//初始化字符数组
char str_s[]="This is an empty string ";//初始化字符数组
char *t=str_t;//初始化字符指针
char *s=str_s;//初始化字符指针
while(*s++=*t++)//*的优先级比++高,且为右结合,因此会将t的值逐个赋值给s,直到结果为'\0'
;
printf("%s\n%s\n",str_t,str_s);
//此处省略了返回值
}

  先用$gcc test1.c编译。编译成功,无提示。再用检查地更严格的-Wall选项试一试。

  $gcc test1.c -Wall

  编译器提示如下:

 $ gcc test1.c -Wall
test1.c: In function ‘main’:
test1.c::: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
while(*s++=*t++)//*的优先级比++高,且为右结合,因此会将t的值逐个赋值给s,直到结果为'\0'
^
test1.c::: warning: control reaches end of non-void function [-Wreturn-type]
}
^

  我们逐个进行分析。

  首先是 warning: suggest parentheses around assignment used as truth value (警告:建议在赋值语句周围使用小括号来表明“真值”)。这是因为我们有语句while(*s++=*t++),在这种情况下,程序员实在是太容易把=和==弄混了。我曾经有一个程序调试了很久都没有发现错误,直到最后发现了这样一个错误:

  while(s=‘\n’)

    ...;

  在这种情况下,除非s总是等于'\n'这个非零值,因此除非while内部有跳转语句,这将会是一个死循环。GCC之所以在这里发出警告就是这个原因,如果这样写

  while((*s++=*t++)),就用括号表明了这是一个赋值语句而不是因为疏忽大意写的关系表达式,另外还有一些程序员喜欢把常量(或者说是右值放在==的左侧)比如:

    if('\n'==x);

这样在编译时如果不小心写成了=也因为编译器的检查(不能赋值)而发现错误,在编译时刻犯错总比在运行时刻犯错要好!

  总之在所有=和==可能混淆的语句中(尤其是if/while/for)如果开启了-Wall或者其它警告选项,GCC就会发出这样的警告,这个时候强烈建议你把GCC提示的地方检查一下!

  第二个警告是 warning: control reaches end of non-void function (警告:控制流到达返回值非void的函数结尾)。这是因为我们定义了int main(),而结束时却没有使用return返回一个int产生的。在早期的K&R C中任何没有显式规定返回类型的函数都默认返回一个int值,任何没有显式返回的非void函数都会返回一个int值(实际上还有任何没有定义类型的变量都会被定义为int型变量,任何没有显式转换的malloc返回值都会被认为是char*……正是一些奇怪的定义),而在C++中,如果main函数结尾没有返回,则会自动加上return 0。这些也正是为什么GCC会通过这个函数的原因,在main()中返回数值的作用大家都是直到,不过如果这个警告出现在别的函数中就要注意了!

  好的,下面是改进过后的程序:

  test1.c

 #include <stdio.h>
int main()
{
char str_t[]="This String comes from t";//初始化字符数组
char str_s[]="This is an empty string ";//初始化字符数组
char *t=str_t;//初始化字符指针
char *s=str_s;//初始化字符指针
while((*s++=*t++))//*的优先级比++高,且为右结合,因此会将t的值逐个赋值给s,直到结果为'\0'
;
printf("%s\n%s\n",str_t,str_s);
return ;
}

  重新用$gcc test1.c -Wall,发现没有刚才的警告了。

  编译器的警告虽然不是错误,但是很多都是介与正确和错误之间的哪些部分,虽然编译器的警告不能使我们的程序百分之百正确,但会使我们离这个目标越来越近,重视编译器的警告也是一个好程序员的习惯。

GCC:条件判断中赋值语句和函数结尾时无返回值的警告的更多相关文章

  1. python 3中对list进行sort时,返回值为None

    进行在用python的list结构时, 发现一个问题: methods = [&apos;blogger.deletePost&apos;, &apos;blogger.get ...

  2. Mariadb MySQL逻辑条件判断相关语句、函数使用举例介绍

    MySQL逻辑条件判断相关语句.函数使用举例介绍 By:授客 QQ:1033553122 1.  IFNULL函数介绍 IFNULL(expr1, expr2) 说明:假如expr1 不为NULL,则 ...

  3. 在条件判断中使用 all() / any()

    在条件判断中使用 all() / any() all() 和 any() 两个函数非常适合在条件判断中使用.这两个函数接受一个可迭代对象,返回一个布尔值,其中: all(seq):仅当 seq 中所有 ...

  4. python中函数的参数和返回值

    目录 函数 目标 01. 函数参数和返回值的作用 1.1 无参数,无返回值 1.2 无参数,有返回值 1.3 有参数,无返回值 1.4 有参数,有返回值 02. 函数的返回值 进阶 示例 -- 温度和 ...

  5. C#中的函数(一) 无参无返回值的函数

    分析下C#中的函数 先写一个小例子,一个静态函数,无返回值,无形参 在第17行与20行分别下断点 F5调试运行,此时中断在第17行MyFunction(), 在第17行右键反汇编,看下反汇编代码 这里 ...

  6. 【Go入门教程3】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...

  7. 【Go入门教程5】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...

  8. 初识python 函数(定义,传参,返回值)

    python基础(二): 菜鸟教程基础知识讲解的非常全面,内容选择我认为的重点输出一遍 函数: 定义一个函数: 你可以定义一个由自己想要功能的函数,以下是简单的规则: def fun(arg): pa ...

  9. 探寻main函数的“标准”写法,以及获取main函数的参数、返回值

    main函数表示法        很多同学在初学C或者C++时,都见过各种各样的main函数表示法: main(){/*...*/} void main(){/*...*/} int main(){/ ...

随机推荐

  1. JSP 标准标签库(JSTL)之最常用的JSTL标签总结

    JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. Apache Tomcat安装JSTL 库步骤如下: 从Apache的标准标签库中下载的二进包(jakarta-t ...

  2. Icacls 在windows目录文件授权中的应用

    前言 最近因工作需要,需要对批量服务器某一目录下的文件进行统一授权,对于linux来说,授权很方便,对于window来说,要对目录下的文件进行批量授权还是很不方便的,windows平台授权自然想到用i ...

  3. EXCEL IF 函数 模糊查询

    A列都是产品名,比如衬衫,长袖衬衫,短袖衬衫,短裙,长裙 搜索A列的产品名,凡是含有“衬衫”的一律在B列对应行输出“衬衫”,凡是含有“裙”字的一律输出“裙子”在B列对应行,请教一下怎么写函数,本来用I ...

  4. 数据持久化之sqlite基本用法

    一.ACID 即原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability). 原子性:整个事务中的所有操作,要么全部完成,要么全部不完 ...

  5. 【CSS】颜色码对照表

    英文代码 形像颜色 HEX格式 RGB格式 LightPink 浅粉色 #FFB6C1 255,182,193 Pink 粉红 #FFC0CB 255,192,203 Crimson 猩红 #DC14 ...

  6. 《The Django Book》实战--第二章--动态网页基础

    这章演示了一些最基本的Django开发动态网页的实例,由于版本不一样,我用的是Django 1.,6.3,有些地方按书上的做是不行的,所以又改了一些,写出来让大家参考. 这是一个用python写的一个 ...

  7. [反编译U3D]Decompile Unity Resources

    工具说明 反编译unity project资源文件,包括ios,android,pc等平台资源,仅供学习使用! 以下工具任选其一,未有特殊说明是可以同时提取unity3.x,unity4.x,unit ...

  8. [km] 如何判断一个直播系统是否使用的是RTMP

    如何判断一个直播系统是否使用的是RTMP from: http://peiqiang.net/2016/03/21/how-to-judge-whether-rtmp-is-used-by-a-liv ...

  9. 转:CentOS设置时区

    from: http://os.51cto.com/art/201004/192805.htm 建议直接使用: 1. session 临时修改查看: tzselect. 然后数字键入,回车 2. 永久 ...

  10. Mybaits学习总结1

    http://www.cnblogs.com/xdp-gacl/p/4261895.html 参考了这篇文章搭建了Mybaits环境,原作者有些地方没有标注使用某种编码,我是自学SQL的,所以深知编码 ...