C语言深度刨析(二)——符号

news2024/11/25 5:00:10

文章目录

  • 前言
  • 注释符号
    • 几个似非而是的注释问题
    • y = x/*p
    • 如何编写出出色的注释
  • 接续符和转义符
  • 单引号、双引号
  • 逻辑运算符
  • 位运算符
    • 左移和右移
    • 0x01<<2+3的值为多少?
  • 花括号
  • ++、--操作符
  • 2/(-2)的值是多少?
  • 运算符的优先级
    • 运算符的优先级表
    • 一些容易出错的优先级问题


前言

参考书籍大家可入群下载:
qq群:829876251
也欢迎热爱C语言的朋友们一起学习交流!!!


符号有什么好说的呢?确实,符号可说的内容要少些,但总有些可以唠嗑地方。/这个符号在C语言里都用在那些地方?,如果你真正掌握了C语言,你就能很轻易的回答上来。这个问题就请读者试着回答一下吧(我刚开始好像就看出了除号,^_^)。
在这里插入图片描述
C语言的基本符号就有20多个,每个符号可能同时具有多重含义,而且这些符号之间相互结合使得C语言中的符号变得更加复杂起来。
你也许听过“国际C语言乱码大赛(IOCCC)”,能获奖的人毫无疑问是世界顶级C程序员。这是他们利用C语言的特点极限挖掘的结果。下面的这个例子就是网上广为流传的一个经典作品:

#include <stdio.h>
main(t,_,a)char *a;{return!0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#\
;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \
q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# \
){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \
iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \
;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \
}'+}##(!!/")
:t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m.vpbks,fxntdCeghiry"),a+1);}

还没发狂?看来你的抵抗力够强的。这是IOCCC 1988年获奖作品,作者是Ian Phillipps。毫无疑问,Ian Phillipps是世界上最顶级的C语言程序员之一。你可以数数这里面用了多少个符号。当然这里并不会讨论这段代码,也并不是鼓励你也去写这样的代码(关于这段代码的分析,你可以上网查询)。恰恰相反,要告诉你的是:
大师把代码写成这样是经典,你把代码写成这样是垃圾!
所以垃圾和经典之间,你需要做一个抉择。

注释符号

几个似非而是的注释问题

C语言的注释可以出现在C语言代码的任何地方。这句话对不对?这是我当学生时我老师问的一个问题。我当时回答是不对。好,我们看看下面的例子:

int /*..*/i;
char* s="abcdefgh   //hijklmn";
//Is it a\
vaild comment?
in/*..*/t i;

我们知道C语言可以有两种注释方式:/**/和//。那上面3条注释对不对呢?建议你亲自在编译器中测试一下。上述三条注释都是正确的,最后一条不正确
第一个,有人会认为编译器剔除掉注释后代码会被解析成inti,所以不正确。编译器的确会将注释剔除,但不是简单剔除,而是用空格代替原来的注释
第二个,我们知道双引号引起来的都是字符串常量,那么双斜杠也不例外。
第三个,这是一条合法的注释,因为\是一个接续符。
第四个,前面说过注释会被替换成空格,那这条注释不正确就很好理解了。
注意:/*...*/这种形式的注释不能嵌套,因为/*总是与离它最近的*/匹配

y = x/*p

y = x/*p,这是表示x除以p指向的内存里的值,把结果赋值为y?我们可以在编译器上测试,编译器提示出错。
实际上,编译器把/*当作是一段注释的开始,把/*后面的内容都当作注释内容,直到出现*/为止。这个表达式其实只是表示把x的值赋给y,/*后面的内容都当作注释。但是由于没有找到*/,所以提示出错。
我们可以修改如下:

y = x/ *p
//或者
y=x/(*p)

这样的话,表达式的意思就是x除以p指向的内存里的值,把结果赋值给y了。
也就是说只要斜杠(/)和星号(*)之间没有空格,都会被当作注释的开始,这一点一定要注意

如何编写出出色的注释

注释写的出色非常的不容易,但是写的糟糕确实人人可为之。糟糕的注释只会帮倒忙。
小故事:
在这里插入图片描述
在这里插入图片描述
出色注释的基本要求

  • 注释应当准确、易懂、防止有二义性。错误的注释不但无益反而有害。
  • 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要及时删除。
  • 注释是对代码的"提示",而不是文档。程序中的注释应当简单明了,注释太多了会让人眼花缭乱。
  • 一目了然的语句不加注释
  • 对于全局数据(全局变量、常量定义等)必须要加注释。
  • 注释采用英文,尽量避免在注释中使用缩写,特别是不常用的缩写。
  • 注释的位置应与被描述的代码相邻,可以与语句在同一行,也可以在上行,但不可放在下方。同一结构中不同区域的注释要对齐。
  • 当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。
  • 注释的缩进要与代码的缩进一致。
  • 注释代码段时应注重"为何做,而不是怎么做"——指明意图
  • 数值的单位一定要注释
  • 对变量的范围给出注释
  • 对一系列的数字编号给出注释,尤其在编写底层驱动程序的时候。(比如管脚编号)
  • 对于函数的入口出口数据给出注释

接续符和转义符

C语言里以反斜杠\表示断行。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到前一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格
反斜杠除了可以被用作接续符,还能被用作转义字符的开始标识
常用的转义字符及其含义:

转义字符含义
\n回车换行
\t横向跳到下一个制表位置
\v竖向跳格
\b退格
\r回车
\f走纸换页
\反斜杠符""
单引号符
\a鸣铃
\ddd1~3位八进制数所代表的字符
\xhh1~2位十六进制数所代表的字符

单引号、双引号

我们都知道双引号引起来的都是字符串常量,单引号引起来的都是字符常量。但初学者还是很容易弄错这两点。比如'a'"a"完全不一样,在内存里面前者占1byte,后者占2byte。详细的分析见后面专栏博客。

逻辑运算符

||和&&是我们经常用到的逻辑运算符,与按位运算符|&是两码事。注意区分。

位运算符

C语言中位运算符包括下面几种:

字符含义
&按位与
|按位或
^按位异或
~取反
<<左移
>>右移

左移和右移

左移运算符<<是双目运算符。其功能把左边的运算数的各二进制位全部左移若干位。由<<右边的数指定移动的位数,高位丢弃,低位补0.
右移运算符>>是双目运算符。其功能是把左边的运算数的各二进制位全部右移若干位。由>>右边的数指定移动位数。注意:对于有符号数,在右移时,符号位将随着移动。当为正数时,最高位补0;而为负数时,符号位为1,最高位补0或是补1取决于编译系统的规定

0x01<<2+3的值为多少?

结果为7吗?测试一下。结果为32?
因为+号的优先级比移位运算符的优先级高。
再思考,在32为系统下,0x01<<2+30;或0x01<<2-3;
这样行吗?
不行!一个整型长度为32位,左移32位发生什么事?溢出!左移-1位呢?反过来移?所以,左移和右移的位数是有讲究的。
左移和右移的位数不能大于数据的长度,不能小于0

花括号

花括号没个人都见过,很简单吧。
char a[10]={"abcde"};
这个表达式正确吗?再看看下面这个例子:
char a[10]{="abcde"};
这个表达式呢?
花括号的作用是什么呢?我们平时写函数,if、while、for、switch语句等都用到了它,但有时又省略掉了它。简单来说花括号的作用就是打包。你想想以前使用花括号是不是为了把一些语句或代码打个包包起来,使之形成一个整体,并与外界绝缘。这样理解就说的通了。

++、–操作符

int i=3;
++i + ++i + ++i = ? (不同编译器处理效果不同,但注意++和+的优先级,答案为18 or 16。)
如何理解 ++i+++i+++i? 分解为:++i + ++i + ++i
(C语言会按照贪心法处理,编译器将程序分解成符号的方法是,从左到右一个一个字符地读入,如果该字符可能组成一个符号那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断。直到读入的字符组成的字符串已不再可能组成一个有意义的符号。)

2/(-2)的值是多少?

2/(-2)的值为多少?2%(-2)的值呢?
假定我们让a除以b,商为q,余数为r:
q=a/b;
r=a%b;
这里我们不妨先假定b大于0
我们希望a、b、q、r之间维持什么样的关系呢?

  1. 最重要的一点,我们希望q*b + r == a,因为这是定义余数的关系。
  2. 如果我们改变a的正负号,我们希望q的符号也随之改变,但q的绝对值不会变。
  3. 当b>0时,我们希望保证r>=0且r<b。
    这三条性质是我们认为整数除法和余数操作所应具备的。但是,很不幸,它们不可能同时成立。
    分析(-3)/2即可明白三条性质无法同时成立。
    因此,C语言或其他语言在实现整数除法截断运算时,必须放弃上述三条性质中的至少一条。大多数编程语言选择放弃第三条,而改为要求余数与被除数的正负号相同。这样性质1和2就可以得到满足。大多数C语言编译器也都是如此。
    所以
    2/(-2)=-1
    2%(-2)= 0

运算符的优先级

运算符的优先级表

在这里插入图片描述
在这里插入图片描述

同一优先级的运算符,运算次序由结合方向所决定
4个一级>单目>双目>三目>其他

一些容易出错的优先级问题

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE课程设计(项目详细设计)

目录 项目文件组织结构 springbootschemaApplication dao controller application.yml entity annotation interceptor config 项目文件组织结构 这是后端部分的源码结构图 springbootschemaApplication springbootschemaApplication是整个项目的入口 package …

AI热门垂直领域大模型盘点(附论文)

上回分享了一些通用大模型的使用感受&#xff0c;今天咱们就来聊聊垂直领域大模型&#xff0c;照旧附上论文资料&#xff0c;同学们自取哈&#xff01; 其实照目前的趋势来看&#xff0c;垂直领域大模型的未来发展是要比通用大模型好的&#xff0c;一是通用大模型有GPT4这座难…

Java手动编码实现与k8s交互式shell

前言 要手动编码&#xff0c;和k8s做shell交互&#xff0c;我们需要弄清以下两个问题&#xff1a; 1、Java如何与k8s做shell交互 2、前端界面如何与Java后台交互 3、多个用户并发访问如何实现 问题1&#xff1a; k8s官方提供了各种语言的KubernetesAPI&#xff0c;对于Ja…

用AI修复郭德纲远古相声;小红书爆款文案Prompt模板;用AI经营一家三明治店;AI将实现80%编程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; B站UP主使用AI修复郭德纲远古相声&#xff0c;10天播放近70万 B站UP主 野老相声-风景-4K修复 使用了AI换脸技术&#xff0c;对郭德纲、…

【ArcGIS Pro二次开发】(41):勘测定界txt文件转数据库(批量)

在规划工作中有时候会收到一种带坐标点的txt文件&#xff1a; 上网查了一下资料&#xff0c;这是根据《勘测定界界址点坐标交换格式》制作的固定格式文件。 其中包含了坐标系、精度、地块编号、地块名称、坐标点等信息。 这个工具的目的就是将TXT格式坐标批量转换为数据库文件…

生物群落(生态)数据统计分析与绘图

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来自经典…

一些WEB测试方法

ladys and 乡亲们&#xff0c;long time no see&#xff0c;发个笔记&#xff1a;&#xff09; 首先&#xff0c;WEB是咋组成的 Web应用程序一般是B/S模式&#xff0c;一个Web应用程序是由完成特定任务的各种Web组件(web components)构成的并通过Web将服务展示给外界&#xff…

最喜爱的编程语言——Python

一、编程语言发展 编程语言&#xff08;programming language&#xff09;可以简单的理解为一种计算机和人都能识别的语言。一种能够让程序员准确地定义计算机所需数据的计算机语言&#xff0c;并精确地定义在不同情况下所应当采取的行动。 编程语言处在不断的发展和变化中&…

上海亚商投顾:沪指延续调整 机器人概念股掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 大小指数今日略显分化&#xff0c;沪指全天震荡调整&#xff0c;深成指、创业板指则拉升翻红。机器人概念股掀涨停…

手把手教你使用抖音DOU+创作个性化视频!

抖音DOU是抖音推出的一项全新功能&#xff0c;旨在为用户提供更加个性化、丰富多彩的内容创作和交流体验。DOU提供了一系列强大的创作工具&#xff0c;包括音频剪辑、特效滤镜、场景转换、字幕编辑等&#xff0c;让用户可以轻松地将自己的创意通过视频分享到抖音平台上来。下面…

数值分析第四章节 用Python实现数值积分与数值微分

参考书籍&#xff1a;数值分析 第五版 李庆杨 王能超 易大义编 第4章 数值积分与数值微分 文章声明&#xff1a;如有发现错误&#xff0c;欢迎批评指正 文章目录 梯形公式矩形公式辛普森公式柯特斯公式复合梯形公式复合辛普森公式 4.1数值积分概论 4.1.1数值积分基本思想 使用某…

【Vue全家桶高仿小米商城】——(四)项目基础架构

第四章&#xff1a;项目基础架构 此章节全力讲解前端基本项目架构&#xff0c;通过此章节可搭建一个通用性的前端架构&#xff0c;内容涵盖跨域方案、路由封装、错误拦截等。 文章目录 第四章&#xff1a;项目基础架构一、前端跨域解决什么是前端跨域&#xff1f;怎么解决前端…

将h5项目转成uniapp小程序

打开微信开发者工具&#xff0c;新建项目&#xff1b;pages下index文件中index.wxml文件打开内容全删除&#xff1b;写入<web-view srchttp://域名.com/></web-view>&#xff1b;编译&#xff0c;成功在小程序中展示&#xff1b;其后&#xff0c;正常按照小程序流程…

scp命令及后台运行

将项目从一个服务器迁移到另外一个服务器的时候 当项目很大的时候 可以用到如下 1、scp -r 本地项目路径 需要迁移服务器的IP:/存放路径 scp -r /u01/media/Disk1/ 192.168.1.31:/u01/media/ reverse mapping checking getaddrinfo for bogon failed - POSSIBLE BREAK-IN ATTEM…

算法篇——动态规划 01背包问题 (js版)——更新新题

416. 分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 链接&#xff1a;力扣 解题思路&#xff1a; 这道题看似是比较简单的背包问题&#xff1a; 首先可以通过判断数组和是否是…

【ZenUML】时序图之ZenUML详解

时序图 序列图是一种交互图&#xff0c;显示进程如何彼此操作以及顺序。 Mermaid可以使用ZenUML渲染序列图。请注意&#xff0c;ZenUML使用的语法与mermaid中的原始序列图不同。 目前&#xff0c;最新版本mermaid v10.2.3 暂时不单独支持zenuml语法,需要配合mermaid-zenuml一…

动态规划_可视化校园导航Floyd算法应用

目录 引言 图片展示 视频展示 针对校园导航问题的分析 关键技术和算法介绍 详细介绍&#xff1a;算法的实现 总结 代码 附件&#xff1a;Map.png 引言 本文主要通过详细的程序打印和作者的推理过程&#xff0c;描述作者对Floyd算法的理解&#xff0c;阐述其中的动态规划思想是如…

突然发现CSDN变得不一样了【建议】【活动】

突然发现CSDN变得不一样了【活动】 前言推荐突然发现CSDN变得不一样了关于上传代码包关于上传视频关于运行代码关于插入代码1关于插入代码2关于社区的建立关于社区的管理关于此次活动的评选关于排行突然发现说明一下关于我 最后 前言 2023-6-19 23:34:04 本文章仅用于参加 20…

【Python 随练】年龄计算问题

题目&#xff1a; 有 5 个人坐在一起&#xff0c;问第五个人多少岁&#xff1f;他说比第 4 个人大 2 岁。问第 4 个人岁数&#xff0c;他说比第3 个人大 2 岁。问第三个人&#xff0c;又说比第 2 人大两岁。问第 2 个人&#xff0c;说比第一个人大两岁。最后问第一个人&#x…

C++基础(8)——类和对象(6)

前言 本文主要介绍了C中多态的基本知识 4.7.1&#xff1a;多态的基本概念和原理剖析 1&#xff1a;基本概念 静态多态&#xff1a;函数重载、运算符重载 动态多态&#xff1a;派生类和虚函数实现运行时多态 静态多态在编译阶段确定函数地址&#xff1b;动态多态在运行阶段…