C语言各种符号的使用介绍上篇

目录
  • 1、注释符号
    • 1.1 注释的基本注意事项
    • 1.2 如何写出好的注释
  • 2、接续符和转移符
    • 2.1 续行功能
    • 2.2 转义字符
  • 3、单引号和双引号
    • 3.1 基本概念
    • 3.2 特殊情况
  • 4、逻辑操作符
    • 4.1 && (逻辑与)
    • 4.2 || (逻辑或)
    • 4.3 逻辑与和逻辑或的笔试题

1、注释符号

1.1 注释的基本注意事项

为了更好的演示我们下面的代码会在 Linux 平台下演示( \ 为续行符):

这段代码,哪一行是有问题的呢?

这里可能有小伙伴就有疑问了,为什么只有这一行出了问题呢?我们知道注释在预处理阶段就被编译器识别出来了,这里我们可以用 Linux 的一个指令:gcc -E test.c -o test.i这样就是对test.c 程序进行翻译,最终把预处理的结果保留下来,接着就可以用 vim 打开我们的预处理结果文件了。

最终我们可以得出这样一个结论:注释被替换本质上是被替换成空格!

这里我们要再提一个简单的点,C语言注释无法被嵌套,/* 总是与最近的 */ 匹配,感兴趣的小伙伴可以去测试下:

int main()
{
    /*
    /*printf("hello world");
    printf("hello world");*/
    */
    return 0;
}

这里还有一个有趣的代码,如果用C语言的注释的话,如果只出现了一个 /* 找不到下面的 */ 的话,那么他就会默认下面所有代码都被注释!

int main()
{
    int x = 10;
    int y = 5;
    int ret = 0;
    int* p = &y;
    ret = y/*p;
    return 0;
}

那么如何解决上面这种情况呢?

在 / 与 * 中加上空格: ret = y / *p;

把 *p 用括号括起来: ret = y / (*p);

推荐第二种,因为看起来会更直观

1.2 如何写出好的注释

[ 建议1 ] 注释应该准确易懂,不能有争议性,错误的注释反而有害。

[ 建议2 ] 要保证注释与代码的一致性,没用的注释及时删除。

[ 建议3 ] 对于全局数据 (全局变量、常量定义)必须要加注释。

[ 建议4 ] 一目了然的语句可以不加注释,比如:i++; // i 自增1。

[ 建议5 ] 注释的位置应与被描述的代码相邻,可以与语句同一行,不放在下方。

[ 建议6 ] 当代码比较长,特别是有多重其那套时,应当在一些段落的结束处加注释。

[ 建议7 ] 注释的缩进要与代码的缩进一致。

[ 建议8 ] 注释代码应当注重,“ 为何做 ” ,而不是 “ 怎么做 ”。

[ 建议9 ] 数值的单位一定要给上注释。

[ 建议10 ] 复杂的函数中,在分支语句、循环语句结束之后需要适当的注释,方便区分各个分支或循环体。

2、接续符和转移符

2.1 续行功能

C语言里用反斜杠( \ )表示断航。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动续接到前一行。但是注意:反斜杠之后不能有空格,感兴趣的小伙伴可以下来测试下:

int main()
{
    int a = 1;
    int b = 2;
    int c = 3;
    if (1 == a && \
        2 == b && \
        3 == c)
    {
        printf("You can see me!\n");
    }
    else
    {
        printf("You can not see me!\n");
    }
    return 0;
}

可能有的小伙伴会好奇,明明我不用 \ 也可以换行不会报错啊,那为什么还要用 \ 表示换行呢?我们作为一个程序员,别人可能也会去阅读我们的代码,如果不带 \ 直接换行可能会出现奇异,在一个也可以告诉编译器这个地方是续行,语义更强!

2.2 转义字符

C语言中,有一些字符,就是他的字面意思,比如 'n','b','t'。 也有一些字符,本身就是特殊含义的,比如:" , ', \ 转义的本质含义是:字面转特殊,或者特殊转字面。

\ 有两种用途:

  1. 当续行符使用
  2. 转义字符使用 (a. 字面转特殊 b. 特殊转字面)

这里我们重点讲一下 \n 和 \r可能小伙伴们都听过换行和回车吧!那么他们本质上的意思是不一样的!但是现在很多编译器让换行( \n )里面也包含了回车( \r ) 的功能!那他们俩究竟有什么样的区别呢?

换行:让光标移动到下一行

回车:光标回到当前行的最开始

这里小伙伴可以试一下用C语言写一个简单的倒计时功能,就能很明显的区分换行和回车的区别了!

这里我们也可以来看一道笔试题:

//以下程序输出什么?
#include <string.h>
#include <stdio.h>
int main()
{
    printf("%d\n", strlen("abcdef"));
    // \62被解析成一个转义字符
    printf("%d\n", strlen("c:\test\628\test.c"));
    return 0;
}

这里第一个打印函数,我们如果有了解,strlen() 函数是求字符串中 \0 之前的字符个数,所以第一个打印的是 6 , 第二个打印函数,首先是 \t 被解析成一个转义字符, \62 也被解析成一个转义字符 (8进制) 所以第二个打印的应该是 14 !

3、单引号和双引号

3.1 基本概念

对于C语言有了解的小伙伴都知道,单引号引起来的都是字符常量,双引号引起来的都是字符串常量,但其实对于初学者来说还是容易出错,比如 'a',和 "a" 是完全不一样的概念,在字符串中,以 \0 为结尾,他本质上不属于字符串的元素内容,只能说他是字符串结束标识符,但是它会占用空间!也就是 'a' 会占一个字节而 "a",则会占两个字节。

有了上面简单的概念我们来看一个例子:

这里可能就有小伙伴有疑问了,前两个和最后一个 printf打印结果我还能理解,可是第三个为啥是占四个字节呢?这明明不是一个字符常量吗?(C++ 中第三个大小为 1 个字节,因为这里是讲C语言所以我们不讨论其他语言)

其实在 C99 标准的规定,'1' 叫做整型字符常量(integer character constant),被看成是 int 类型。

光是用 “ 标准规定 ” 用来证明是不可行的,我们再用一个实例来证明:

看到这个结果不要惊讶,我刚刚说过,标准规定,整型字符常量被看成是 int 类型,所以他会有四个字节的空间,而且我当前电脑是小端存储,所以低字节序放在低地址处,在者,将一个4字节的数据放入 char 类型的变量中是会发生数据截断的,会将低地址的一个字节内容放入 char 类型的变量中,所以其实最终 c 变量里放的只是一个 'd' 字符!

但是我不推荐上面这种写法!!!我们明白其中道理就好。

那这里有的小伙伴又开始下去实验了,于是写出了这样的代码:

因为一个整型字符常量只有 4 个字节空间,他如何能放得下 5个字节甚至更多呢?

3.2 特殊情况

显而易见,是不能出现空整型字符常量的,但是可以出现空字符串,因为字符串结束标识符 \0 虽然不能算字符串元素内容,但是它也是占大小的。

4、逻辑操作符

4.1 && (逻辑与)

概念:级联两个(多个)逻辑表达式,必须同时为真,结果才为真。

例子:

对于逻辑与的短路现象,因为我们编译器是从左往右扫描的,所以如果当表达式左边为假的话,它就不会去执行逻辑与右边的表达式,这也就是我们所称的短路现象:

4.2 || (逻辑或)

概念:级联两个(多个)逻辑表达式,必须至少一个为真,结果才为真。

例子:

上面这个例子同时也包含了逻辑或的短路现象,在逻辑或中,因为编译器是从左往右扫描代码的,所以只要表达式左边为真,则不需要进行右边的判断。

4.3 逻辑与和逻辑或的笔试题

因为对于前置++和后置++我还没有讲,所以有基础的同学可以先看看,没基础的可以等我下期出了符号第二期在回来看这道题。

第一个逻辑与表达式,a 变量的初始值是 0 ,而且是后置++,先使用表达式的值,在进行自增,而逻辑与必须满足表达式两边的值都为真,但凡有一个为假都不会执行后面的表达式,所以只有 a 变量发生了变化。第二个逻辑或表达式,逻辑或只要表达式两边有一个为真即可,a++ 判断为假,会接着判断 ++b, 前置++ 是先自增在使用,所以 ++b 表达式为真,也就不会去执行后面表达式了,也就是说,只有 a和b变量的值发生了变化。

到此这篇关于C语言各种符号的使用介绍上篇的文章就介绍到这了,更多相关C语言符号内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-08-10

详解C语言中的符号常量、变量与算术表达式

C语言中的符号常量 在结束讨论温度转换程序前,我们再来看一下符号常量.在程序中使用 300.20 等类似的"幻数"并不是一个好习惯,它们几乎无法向以后阅读该程序的人提供什么信息,而且使程序的修改变得更加困难.处理这种幻数的一种方法是赋予它们有意义的名字.#define 指令可以把符号名(或称为符号常量)定义为一个特定的字符串: #define 名字 替换文本 在该定义之后,程序中出现的所有在 #define 中定义的名字(既没有用引号引起来,也不是其它名字的一部分)都将用相应的替换文本

C语言详细讲解注释符号的使用

目录 一.注释规则 二.注释中一个有趣的问题 三.教科书型注释 四.迷惑型的注释 五.忽悠型注释 六.搞笑型注释 七.漂亮的程序注释 八.小结 一.注释规则 编译器在编译过程中使用空格替换整个注释 字符串字面量中的 // 和 /*...*/ 不代表注释符号 /*......*/ 型注释不能被嵌套 下面看一下这样一段代码: #include <stdio.h> int main() { int/*...*/i; char* s = "abcdefgh //hijklmn";

C语言特殊符号的补充理解

续接符 反斜杠"",他有两种最常见的功能,一就是续航功能,二就是我们提到反斜杠就会很敏感的转义字符. if("1==a&&2==b&&3==c) { printf("hello\n"); } 有以上的代码我们可以等价于 if("1==a&&\ 2==b&&\ 3==c) { printf("hello\n"); } 这里反斜线就起到了一个连接上下两行的代码,在咱看

举例讲解C语言链接器的符号解析机制

1. 符号分类 (1)全局符号:非静态全局变量,非静态函数 (2)外部符号:定义于其它模块,而被本模块引用的全局变量和函数 (3)本地符号:静态变量(包括全局和局部),静态函数 对于静态局部变量,编译器会为其生成唯一的名字.如x.fun1,x.fun2.本地符号对链接器来说是不可见的. 2. 符号决议 当编译器遇到一个不是本模块定义的符号时,会假设该函数由其它模块定义,并生成一个链接器符号表条目,交由链接器处理.如果链接器在它的任何输入模块都没有找到该符号,会给出一个类似undefined re

C语言中弱符号与弱引用的实际应用

最近在学习<程序员的自我修养--链接.装载与库>时,get到了一个新的知识点:弱符号与弱引用.书中简短的介绍,让我了解到弱符号的含义以及使用方式.了解我的朋友,应该知道我喜欢将知识点与我们实际工作结合起来,在工作中利用起来,正所谓学以善用.根据我的理解,觉得利用弱符号的特性可以帮组我们在工作中编写出更加稳定,可复用,可组合的优秀代码.在此向大家分享. 符号重定义错误 在编码过程中,我们经常遇到符号重定义的错误.编译器会报如下错误: multiple definition of `xxx'; 这

C语言中无符号数和有符号数之间的运算

C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 直接看例子来说明问题吧 #include <iostream> using namespace std; int main() { int a = -1; unsigned int b = 16; if(a > b) cout<<"负数竟然大于正数了!\n";

C语言详细解析有符号数与无符号数的表示

目录 一.计算机中的符号位 二.有符号数的表示法 三.无符号数的表示法 四.signed 和 unsigned 五.小结 一.计算机中的符号位 数据类型的最高位用于标识数据的符号 最高位为1,表明这个数为负数 最高位为0,表明这个数为正数 下面看一段代码,用于判断数据的符号: #include <stdio.h> int main() { char c = -5; short s = 6; int i = -7; printf("%d\n", ( (c & 0x80

C语言中无符号与有符号及相加问题

C语言中无符号与有符号问题 unsigned char a[5] = { 12,36,96,128,182 }; a[]范围为0~256. 数组中数都有效. char a[5] = { 12,36,96,128,182 }; a[]范围为-128~127. 数组中128和182均无效. C语言中无符号数和有符号数相加问题 看个题: #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n"

C语言各种符号的使用介绍下篇

目录 1.按位运算符 1.1 按位或( | )和按位与( & ) 1.2 按位异或( ^ ) 1.3 一个关于整型提升的问题 2.移位操作符 2.1 左移<< 右移>>操作符 2.2 习题练习 3.++和--的操作 3.1 基本操作 3.2 从汇编角度深入理解a++ 1.按位运算符 1.1 按位或( | )和按位与( & ) 上期我们讲到过逻辑或和逻辑与,他们得到的结果是真假值,但我们一定要区分清楚,按位运算符 "|" 和 "&

Go语言命令行操作命令详细介绍

Go 命令 Go语言自带有一套完整的命令操作工具,你可以通过在命令行中执行go来查看它们: 图1.3 Go命令显示详细的信息 这些命令对于我们平时编写的代码非常有用,接下来就让我们了解一些常用的命令. go build 这个命令主要用于测试编译.在包的编译过程中,若有必要,会同时编译与之相关联的包. 1.如果是普通包,就像我们在1.2节中编写的mymath包那样,当你执行go build之后,它不会产生任何文件.如果你需要在$GOPATH/pkg下生成相应的文件,那就得执行go install了

Go语言的代码组织结构详细介绍

包(package) 一个程序以一个包的形式构建,这个包还可以使用其他包提供的一些设施. 一个golang程序的创建是通过链接一组包. 一个包可以由多个源码文件组成. 导入包中的名字可以通过packagename.Itemname访问. 源码文件结构 golang每个源码文件包括: - 一个package字句(文件归属于哪个包):其名字将作为导入包时的默认名字. 复制代码 代码如下: package fmt - 一个可选的import声明集 复制代码 代码如下: import "fmt"

Android 各国语言缩写及简称详细介绍

android资源文件夹的写法规则: 语言缩写-国家地区缩写 语言缩写请参阅: 国家地区缩写 en 英文 en_US 英文 (美国) ar 阿拉伯文 ar_AE 阿拉伯文 (阿拉伯联合酋长国) ar_BH 阿拉伯文 (巴林) ar_DZ 阿拉伯文 (阿尔及利亚) ar_EG 阿拉伯文 (埃及) ar_IQ 阿拉伯文 (伊拉克) ar_JO 阿拉伯文 (约旦) ar_KW 阿拉伯文 (科威特) ar_LB 阿拉伯文 (黎巴嫩) ar_LY 阿拉伯文 (利比亚) ar_MA 阿拉伯文 (摩洛哥) a

易语言取符号命令使用讲解

取符号命令 操作系统支持:Windows.Linux  所属类别:算术运算 返回一个整数,如果小于零,表明给定数值为负:如果等于零,表明给定数值为零:如果大于零,表明给定数值为正. 语法:  整数型  取符号(欲取其符号的数值) 例程 说明: 根据返回的整数值判断数值得正负号. 将数值编辑框的内容转换到数值型,把转换后的数值取其符号, 再把返回的整数型数据转换到文本型,放入取符号标签的标题中. 运行结果: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价

易语言基础教程之软件界面介绍

易语言之所以称为全可视化编程语言,就是因为它的开发界面和DOS界面下的一般编程界面相比,是图形化的:它所制作的应用程序图形,就是日后运行时看到的程序界面.整个编程过程都是可视的,可以称之为"所见即所得". 下面,我们就启动易语言的软件界面,给大家介绍熟悉易语言软件界面 熟悉易语言软件界面 选择"程序",点击"新建"按钮,选择第一个,如下图所示,再单击"确定",将自动建立一个新程序,该程序可在保存时命名. 程序窗口由上往下依次是

c语言算术运算符越界问题解决方案

大量的安全漏洞是由于计算机算术运算的微妙细节引起的, 具体的C语言, 诸如符号数和无符号数之间转换, 算术运算的越界都会导致不可预知的错误和安全漏洞, 具体的案例数不胜数. 作为一个系统程序员, 有必要对这些细节有深入的了解. 本篇参考csapp, 主要介绍如何判断算术运算的越界问题. (虽然本篇的代码经过大量的测试, 但本人仍然无法保证代码的正确性, 希望大家纠错). 讲解的原则是"摆定理, 不证明, 写代码". 具体的证明过程在csapp中有详细的讲解, 也不是太难. 主要使用关键

各种编程语言中$符号的意义

0 前言 最近开发过程中使用了多种脚本语言,在这些语言中发现很多的$符号,而每种脚本语言的$符号的用法和意义均不相同,所以借博文总结总结.在linux应用开发中经常使用makefile脚本和shell脚本,有趣的是,这两种脚本使用$符号时存在明显差异,虽然在这两种脚本中$均和变量有关,但是makefile中变量使用括号包裹,而shell脚本缺并不需要括号. 1 shell脚本 定义变量 复制代码 代码如下: VAR=<value> 使用变量,变量名不需要使用括号包裹 复制代码 代码如下: $V

Java语言十大基础特性分析

Java语言的作者们编写了具有广泛影响的Java白皮书,里面详细地介绍了他们的设计目标以及实现成果,还用简短的篇幅介绍了Java语言的特性.下面将对这些特性进行介绍. 1. 简单 Java语言的语法简单明了,容易掌握,而且是纯面向对象的语言.Java语言的简单性主要体现在以下几个方面: 语法规则和C++类似.从某种意义上讲,Java语言是由C和C++语言转变而来的,所以C程序设计人员可以很容易地掌握Java语言的语法. Java语言对C++进行了简化和提高.例如,Java使用接口取代了多重继承,

IOS开发之路--C语言存储方式和作用域

概述 基本上每种语言都要讨论这个话题,C语言也不例外,因为只有你完全了解每个变量或函数存储方式.作用范围和销毁时间才可能正确的使用这门语言.今天将着重介绍C语言中变量作用范围.存储方式.生命周期.作用域和可访问性. 变量作用范围 存储方式 可访问性 变量作用范围 在C语言中变量从作用范围包括全局变量和局部变量.全局变量在定义之后所有的函数中均可以使用,只要前面的代码修改了,那么后面的代码中再使用就是修改后的值:局部变量的作用范围一般在一个函数内部(通常在一对大括号{}内),外面的程序无法访问它,