10.13 抽空的时间 往年程序比赛真题笔记

发布于 2024-10-13  948 次阅读


在逻辑运算中,逻辑与(AND)运算的优先级高于逻辑或(OR)运算

即&&先算,然后才是 || 和位运算符挺像,都是 | 是最终boss

当然,逻辑非!肯定是先锋,毕竟是一元运算符

我最初就有个疑问,这个题目的int c=0; !c是什么意思?

你再好好想想,在编程里面什么是对,什么又是错

不是true和flase,而是0和非0!

只要是非0,你就是对,你就是正义!

所以,!c中的这个反骨仔!会输出0的值


遇上了字符串类型的数组(其实字符串就是以字符数组的形式存储的),在这里特意了解下这里的知识点

在C语言中,每个字符串都以空字符 \0(即ASCII值为0)结束

// 定义字符数组并初始化
char str1[6] = "Hello"; // 包括末尾的空字符

这是最常用的字符数组定义和初始化格式

可以看到,这里并没有用到{ },而是直接使用了“ ”

但是你得注意的是,在这个例子中,数组大小为6,因为5个字符加上一个空字符 \0,这也是字符数组的默认法则

在C99标准之后,可以直接将字符串赋值给字符数组,但必须在定义时初始化:

char str5 = "Hello"; // 这样定义和初始化

其实也就是你只有在定义的时候不必写上[ ]中间的6

int main() {
char sss[] = "abcde";//如果你要填,那也是6而不是5
printf("%s\n%c", sss, sss[0]); // 这里你不能加上[ ]
//在 printf 函数中,sss[] 是不合法的。正确的用法是直接使用 sss,因为 sss 本身就是指向数组的首元素的指针(现在没学,你只要知道就好了)
}
return 0;

这个拷贝存储的字符串直接使用就是整体,分开用就是单个字符

比如上面会输出abcde和a的值


my god 现在看这个题还是不懂。。。。

char s[]="\101\101xyz";
printf("%d",strlen(s));

chatgpt告诉我,\101 是一个八进制转义序列

我直接当场懵逼了,且听它是怎么分析的:

反斜杠(\

  • 在C语言中,任何以反斜杠开头的字符序列被视为转义序列。反斜杠后面跟随的字符会被解析成特定的值

有效的八进制数字:八进制数字是由 0-7 组成的。在 \101 中,10 和 1 都是有效的八进制数字。八进制转义序列可以包含一个到三个八进制数字,也就是说,\1\12 和 \123 都是有效的

  • 形式:\ooo,其中 ooo 是一到三位的八进制数字(0-7)
  • 例如,\101 代表的是八进制 101,转换为十进制是 65,对应字符 A

我们再来看看十六进制的转义序列

十六进制转义序列

  • 形式:\xhh,其中 hh 是一到两个的十六进制数字(0-9 和 A-F)
  • 例子:
    • \x41 对应十六进制 41,而 41 在十进制中是 65,对应字符 A
    • \x20 代表空格字符,因为 20 是十进制 32

. 二进制序列(无直接的转义序列)

  • 在标准C语言中,没有直接的二进制转义序列。也就是说,你无法像使用八进制(\ooo)或十六进制(\xhh)那样直接通过转义序列表示二进制数。
  • 如果需要表示一个二进制值,你通常需要将其转换为十进制或十六进制。例如,要表示二进制 01000001(对应字符 A),可以使用 \x41 表示。

再来科普下,十进制数值并没有特定的转义序列你可以直接使用十进制数字,而不需要加反斜杠(\

char a = 65; // a 的值是字符 'A'

如上代码,你并不需要额外加上反斜杠


好了,现在你依旧很懵逼,还是不会啊!

你知道了八进制转义字符,那么你应该它换成十进制,然后根据ASCII表将其转化为对应值

前面已经说过,ASCII码其实就是十进制形式

如\101,就是十进制的65,所以它对应的字符是 ASCII 码 65,即字母 A


OK,再来分析strlen函数,我现在在那个专门收录函数的文章上写了

很傻逼的是,我遇见了\\101,\101已经知道,但是前面的\可和这个没关系啊!

这其实tm就是单纯的、单独的反斜杠,是一个字符串。。。。

届ける言葉を今は育ててる
最后更新于 2024-10-13