C语言笔记(符号)

注释符号

  • 几个似非而是的注释问题

例子:

(A) int / * ... * /i;
(B) char * s = "abcdefgh    //hijklmn";
(C) //Is it a \valid comment?
(D) in/ * ... * /t i;

我们知道C语言里可以有两种注释方式:“/* */” 和 “ // ”。那么上面几条注释是否正确。

(A)中,有人认为Bain一起剔除掉注释后代码会被解析成int i,所以不正确。编译器的确会将注释剔除,但不是简单的剔除,而是 用空格代替原来的注释 。 如:/* 这是*/ # /*一条*/ define /*合法的*/ ID /*预处理 */ replacement /*指*\ list /* 令*/
(B)中,我们知道双引号引起来的都是字符串常量,那双斜杠也不例外。
(C)中,这是一条合法的注释,因为“\”是一条接续符。
(D)中,前面说过注释会被空格替换,那这里也很好理解了。

  • y = x /*p
    只要斜杠(/)和星号(*)之间没有空格,都会被当作注释的开始,这一点一定要注意。

  • 怎么写出出色的注释

  • 注释应当准确、易懂、防止有二义性。错误的注释不但无益反而有害
  • 边写代码边注释,修改代码的同时修改相应的注释,以保证注释与代码的一致性,注释太多了会让人眼花缭乱。
  • 一目了然的语句不加注释。
  • 对于全局数据(全局变量、常量定义等)必须要加注释。
  • 注释采用英文,尽量避免在注释中使用缩写,特别是不常用的缩写。
  • 注释的位置应与被描述的代码相邻,可以与语句在同一行,也可以在上行,但不可放在下方。同一结构中不同域的注释要对齐。
  • 当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。
  • 注释的缩进要与代码的缩进一致。
  • 注释代码段应注重“为何做(why)”而不是“怎么做(how)”
  • 数值的单位一定要注释。
  • 对变量的范围给出注释,尤其是参数。
  • 对一系列的数字编号给出注释,尤其在编写底层驱动程序的时候(比如引脚编号)。
  • 对于函数的入口/出口数据、条件语句、分支语句给出注释。
  • 避免在一行代码或表达式的中间插入注释。
  • 复杂的函数中,在分支语句、循环语句结束之后需要适当的注释,方便区分各分支或循环体。
  • 对于不需要被编译的区域要使用条件编译来实现,例如,使用带有注释的 #if 或 #ifdef 结构。

接续符和转义符

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

单引号、双引号

双引号引起来的都是字符串常量,单引号引起来的都是字符常量。

逻辑运算符

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

int i = 0;
int j = 0;
if ((++i > 0) || (++j > 0))
{// 打印出i和j的值
}//结果: i = 1; j = 0;

不要惊讶。逻辑运算符“ || ”两边的条件只要有一个为真,其结果就为真;逻辑运算符“ && ”两边的条件只要有一个结果为假,其结果就为假。if ((++i > 0) || (++j > 0))语句中,先计算(++i > 0),发现其结果为真,后面的(++j > 0)便不再计算;同样“&&”运算符也要注意这种情况。这是容易出错的地方。在某些情况下,逻辑运算符可以代替if语句

int a = 3;
int b = 5;
if (a < b)
{a = b;
}
/************/
//等同于
(a < b) && (a = b);//如果前面为假,则整体为假,后面也不需要执行
//如果前面为真,还要考虑后面是否为真,继续执行后面的式子

位运算符

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

&……按位与
| …….按位或
^…….按位异或
~…….取反
<<….左移
>>….右移

前四种操作很简单,一般不会出错。但要注意按位运算符“ | ”和 “ & ”与逻辑运算符“ || ”和 “ && ”完全是两码事,别混淆了。其中按位异或操作可以实现不用第3个临时变量交换两个变量的值: a ^=b; b ^= a; a ^= b;但并不推荐这么做,因为这样的代码读起来很费劲。

  • 位操作需要用宏定义好后再使用。
//例如常用的位操作宏
#define SETBIT(x, y)   ((x) |= (y))
#define CLRBIT(x, y)   ((x) &= ~(y)) // 要十分小心y是否是有符号数
//建议不适用取反操作,而是自己计算需要的值,否则非常容易出错
#define TOGLBIT(x, y)  ((x) ^= (y))
#define TESTBIT(x, y)  ((x) & (y))
  • 如果位操作符’~’和‘<<’ 应用于基本类型无符号字符型或无符号短整型的操作数,结果会立即转换成操作数的基本类型。
#include <stdint.h>
#inlcude <stdio.h>
int main()
{uint8_t port = 0x5aU;uint8_t result_8;uint16_t result_16;result_8 =(~port)>>4;               //不能得到期待的0xa5result_8 =((uint8_t)(~port))>>4;            //正确的写法result_16=((uint16_t)(~(uint16_t)port))>>4; //正确的写法return 0;   
}
  • 位运算符不能用于基本类型(underlying type)是有符号的操作数上。
  • 一元减运算符不能用在基本类型无符号的表达式上,除非在使用之前对两个操作数进行大小判断,且被减数必须大于减数
  • 左移和右移

左移运算符“<<”是双目运算符,其功能是把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数制定移动的位数,高位丢弃,地位补0.
右移运算符“>>”是双目运算符,其功能是把“>>”左边的运算数的各二进位全部右移若干位,由“>>”右边的数制定移动的位数。但注意:对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0;而为负数时,符号位为1,最高位补0或是补1取决于编译系统的规定。Turbo
C和很多系统规定补1.
左移和右移的位数不能大于和等于数据的长度,不能小于0.

++、- - 操作符

之前的博客里有这方面的介绍(传送门)
贪心法:每一个符号应该包含尽可能多的字符。还需要注意的是:除了字符串和字符常量,符号的中间不能嵌有空白(空格、制表符、换行符等),比如:==是单个符号,而==是两个等号

除法

三条性质:

  • 最重要的一点,我们希望q * b + r == a,因为这是定义余数的关系。
  • 如果我们改变 a 的正负号,希望 q 的符号也随之改变,但 q 的绝对值不会变。
  • 当 b > 0 时,我们希望保证r >= 0 且 r < b .

但是他们不能同时成立。大多数编程语言选择了放弃第3条,而改为要求余数与被除数的正负号相同,这样性质1和性质2就可以得到满足。大多数 C 语言编译器也都是如此。

运算符的优先级

这里写图片描述

记忆技巧:
① 伪运算符的优先级最高,单目运算符优先级总是高于双目;
② 对于双目运算符而言,算术运算>位运算>逻辑运算;
③ 自右向左结合的运算符只有单目运算符和赋值运算符。

2 一些容易出错的优先级问题,见下表。
这里写图片描述

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

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

相关文章

java 命令: jmap 命令使用 ( 查看内存使用、设置 )

jdk安装后会自带一些小工具&#xff0c;jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 jmap命令可以获得运行中的jvm的堆的快照&#xff0c;从而可以离线分析堆&#xff0c;以检查内存泄漏&am…

只用一套解决方案,就可解决80%的交通物流行业信息难题

行业背景 新中国成立70多年来&#xff0c;中国交通运输总体上已经形成了多节点、全覆盖的综合运输网络&#xff0c;“五纵五横”综合运输大通道基本贯通&#xff0c;一大批综合客运、货运枢纽站场&#xff08;物流园区&#xff09;投入运营&#xff0c;取得了一系列瞩目成果&am…

Linux 使用 jstat 命令查看 jvm 的 GC 情况

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Options&#xff0c;选项&#xff0c;我们一般使用 -gcutil 查看gc情况 vmid&#xff0c;VM的进程号&#xff0c;即当前运行的java进程号…

Docker 方式安装 Nginx 、阿里云服务器上装 Ngnix

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 非 Docker 方式安装&#xff0c;直接 Linux 安装见另一文&#xff1a;Linux 上 安装 nginx 、阿里云服务器上安装 nginx 1. 直接从镜像仓…

C#实现A*算法

理解A*寻路算法具体过程 这两天研究了下 A* 寻路算法, 主要学习了这篇文章, 但这篇翻译得不是很好, 我花了很久才看明白文章中的各种指代. 特写此篇博客用来总结, 并写了寻路算法的代码, 觉得有用的同学可以看看. 另外因为图片制作起来比较麻烦, 所以我用的是原文里的图片. 当…

玩转数据结构——均摊复杂度和防止复杂度的震荡(笔记)

数据规模 时间复杂度 并不是所有的双层循环都是O&#xff08;n^2&#xff09;的 复杂度实验来确定复杂度 // O(N) 两倍增加 int findMax( int arr[], int n ){assert( n > 0 );int res arr[0];for( int i 1 ; i < n ; i )if( arr[i] > res )res arr[i];return res…

解决:bash: vim: command not found、docker 容器不识别 vi / vim 、docker 容器中安装 vim

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 在 Docker 容器中编辑文件&#xff0c;报错如下&#xff1a; bash: vim: command not found2. 安装 vim &#xff1a; apt-get in…

怎样正确使用车灯?

当我们被对面来车明晃晃的远光灯照得意识模糊时&#xff0c;当你快速接近一辆摩托车却发现那是一辆坏了一盏尾灯的卡车时&#xff0c;或是当你前方的小车忽然亮起倒车灯却在往前行驶&#xff0c;最后意识到那只是因为刹车灯与倒车灯线路颠倒时&#xff0c;你就会发现在人们都认…

如何配置DDS以使用多个网络接口?How do I configure DDS to work with multiple network interfaces?

最近在使用OpenDDS的时候遇到一个问题&#xff1a;存在多个虚拟网卡时&#xff0c;发布&#xff08;订阅&#xff09;端重新连接时会阻塞几分钟&#xff0c;在外网找到一篇与此相关的文章。 You cannot specify which NICs DDS will use to send data. You can restrict the NI…

使用可靠多播与OPENDDS进行数据分发

介绍 也许应用程序设计人员在创建分布式系统时面临的最关键决策之一是如何在感兴趣的各方之间交换数据。通常&#xff0c;这涉及选择一个或多个通信协议并确定向每个端点分派数据的最有效手段。实现较低级别的通信软件可能是耗时的&#xff0c;昂贵的并且容易出错。很多时候&a…

margin为负值的几种情况

1、margin-top为负值像素 margin-top为负值像素&#xff0c;偏移值相对于自身&#xff0c;其后元素受影响&#xff0c;见如下代码&#xff1a; 1 <!DOCTYPE html>2 <html lang"zh">3 <head>4 <meta charset"UTF-8" />5 &l…

事件EVENT,WaitForSingleObject(),WaitForMultipleObjecct()和SignalObjectAndWait() 的使用(上)

用户模式的线程同步机制效率高&#xff0c;如果需要考虑线程同步问题&#xff0c;应该首先考虑用户模式的线程同步方法。但是&#xff0c;用户模式的线程同步有限制&#xff0c;对于多个进程之间的线程同步&#xff0c;用户模式的线程同步方法无能为力。这时&#xff0c;只能考…

axios 中文文档、使用说明

以下内容全文转自 Axios 文档&#xff1a;https://www.kancloud.cn/yunye/axios/234845 ##Axios Axios 是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 node.js 中。 Features 从浏览器中创建 XMLHttpRequests从 node.js 创建 http 请求支持 Promise API拦截请…

数据库 -- 02

引擎介绍 1.什么是引擎 MySQL中的数据用各种不同的技术存储在文件&#xff08;或者内存&#xff09;中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术&…

OpenDDS用idl生成自定义数据类型时遇到的一个问题

问题&#xff1a;这里会提示LNK2005重复定义的错误 解决方案&#xff1a; 解决后&#xff1a;

Docker 方式安装 Nexus 私服

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 从Docker 官方仓库查找镜像&#xff1a; docker search nexus 2. 拉取镜像&#xff1a; docker pull 你选中的镜像的名字  pull…

shader飞线改进版

项目github地址&#xff1a;https://github.com/ecojust/flyline 前面写过一个飞线(基于THREE.Line进行的颜色变化)&#xff0c;只是简单地将可视区片元颜色的alpha通道值设为1.0&#xff0c;不在可视区的设为0.0。效果是这样的&#xff1a; 做得很粗糙&#xff0c;而且因为线是…

C++获取本机所有ip地址,可区分类型是有线无线虚拟机还是回环

一个小程序&#xff0c;可以获取本地所有ip地址&#xff0c;包括有线&#xff0c;无线&#xff0c;虚拟机&#xff0c;环回接口网卡&#xff0c;等。 如图&#xff0c;一台机器多个网卡&#xff1a; 程序执行结果&#xff1a; #include"stdio.h" #include"…

Mybatis 在 IDEA 中使用 generator 逆向工程生成 pojo,mapper

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 使用mybatis可以逆向生成pojo和mapper文件有很多种方式&#xff0c;我以前用的是mybtais自带的generator包来生成&#xff0c;连接如下&…

C++11多线程----线程管理

说到多线程编程&#xff0c;那么就不得不提并行和并发&#xff0c;多线程是实现并发&#xff08;并行&#xff09;的一种手段。并行是指两个或多个独立的操作同时进行。注意这里是同时进行&#xff0c;区别于并发&#xff0c;在一个时间段内执行多个操作。在单核时代&#xff0…