有关c语言中的反斜杠 '\'
2020-02-02
关键字:反斜杠趣谈
稍微懂点编程的同学,甭管是哪种编程语言,都知道甚至是在代码中用过反斜杠。
反斜杠这东西的最为人所知的作用就是作为“转义字符”以及“连接符”来使用。
例如,常见的正则表达式用途:
grep -nr "init*\.rc"
以及在 c语言 领域常见的连接代码用途:
#define LOG(a,b) do{\ printf("[LOG]%d--%d", a, b); \ }while(0)
但笔者偶然间发现反斜杠的一个很隐秘又有趣的地方。
先来看下面这个示例程序,我们来猜猜它的执行结果是什么:
#include <stdio.h> int cal_length(char *); int main() { int amount; char *info = "China and France should respect each other."; //TODO 要考虑到单双引号前面的转义字符\ amount = cal_length(info); printf("The amount of the sentance:%d\n", amount); return 0; } int cal_length(char *sen) { int len = 0; while(*(sen + len) != '\0') { len++; } return len; }
正确答案是:不确定!
如上图,同一个编译结果,多次执行会出现不一致的结果值。
是我写的 cal_length() 算法有问题吗?
显然不是,不用去怀疑我的 cal_length() 函数。
既然计算字符串长度的算法没问题,传参的方式也没问题,原始字符串也没问题,取结果的方式也没问题。那为什么最终的结果怎么会是这样的呢?
刚开始我也百思不得其解,各种加打印改算法都无济于事。
直到最后,我不得不怀疑上面的代码中 amount = cal_length(info); 这一句根本没有去执行。
然后我开始验证,发现直接将这句代码删掉,编译以后的结果和前面是一样的,结果值是一个不确定的值。
然后再去给定义 amount 变量的地方指定初始值,发现这时程序运行结果值就是确定的值了,我给 amount 初始化了什么值,它的运行结果就是什么值。
到这已经确定了,我上面的代码中 amount = cal_length(info); 语句根本就没有执行。
而不行它的原因就是因为我在它上面加的那一句注释。
在那行注释最后面有一个反斜杠 '\',C编译器直接将这个反斜杠理解为了“连接符”,认为它的下面一行仍然是注释内容。
真是清新脱俗的一个乌龙错误。
同时也不得不感叹小小一个反斜杠也有这么多门道。
+++