高级语言程序设计13013

一、C语言语句

  1. 数据定义语句
  2. 表达式语句
  3. 流程控制语句
  4. 复合语句
  5. 空语句
  6. 其它语句

二、C语言词类

  1. 常量
  2. 特殊符号
  3. 保留字
  4. 标识符

三、结构化程序设计的工具

  1. N-S盒图
  2. 伪代码

四、C语言数据类型

1.整型

2.实型

3. 字符型

4. 数组型

5. 结构体类型

6.指针型

7.空类型

五、一个长整型的数字,如何取到他的最左边的数字?如何获取他的长度?

之前python中是转成字符串,然后获取字符串的长度有现成的函数调用,取字符串最左边的字符时,也有现成的函数调用就行,现在是C语言,如何做呢?

例如:12321, 取最左边的数字, = 这个数字本身除以10的(长度-1)次方后,取整;

即: 12321/10^5-1, 这样表示 12321 * 10^-4次方, 即,小数点向左移4位,得到:1.2321, 然后取整,就得到最左边的数字1;

求数字长度也是如此:开循环,让这个数字本身除以10的(长度-1)次方后,如果值大于0,则此长度不是该数字的长度,长度自减,直至该值第一次变成小于0时,此时的长度就是该数字的长度了。

觉得很巧妙,数学的魅力体现出来了。

从右往左取几位,就用模运算,取几位,就模10的几次方,这样就变相去掉一个数字的左边几位数字,

用这个数字除以10的几次方,就变相去掉这个数字右边的几位数字。

判断一个数学是否是回文数字思路:当长度大于0并且是否回文标记精确等于0时,开循环,取左边一位数字,取右边一位数字,自身变成去掉左右各一位数字的数,同时数字长度自减2,判断取到的左边是否于右边相等,如果不等,是否回文的标志改变,一直至循环结束,如果有一次不等,就不是回文了,所以思路是,默认是相等的标志,如果有一次不等,就改变是否回文的标志值。

六、C语言中的分隔符为什么不是;号呢?

七、 short b=-6, b为有符号的十进制整数,对应的二进数为 1111 1111 1111 1010

1)先写出+6的二进制为:0000 0000 0000 0110

2)对+6取反,得到反码为:1111 1111 1111 1001

3)反码加1,得到补码:

1111 1111 1111 1001
+      1
——————----
1111 1111 1111 1010

为什么-6二进制是求它的补吗?

八、我看懂下面这个过程了,但我不理解为什么??????5555555555555

result = 0x3

九、C语言中 mask屏蔽字的作用是什么?为什么 int mask; mask =1<<15; 这个结果等于32768呢?

掩码(Mask) 在 C 语言中是一个用于位级操作的“模板”或“过滤器”,它通过按位运算来操作一个数据中的特定位。

掩码的作用

十、将用户输入的一个整数,以 16 位二进制的形式显示在屏幕上,并且每 4 位用空格分隔,便于阅读。用代码实现:

十一、字长

CPU内部用于整数计算的数据通路的宽度。

十二、“逻辑或”短路示例。“短路求值”

还有这种套路呢,我一下就陷进去了。

  • ✅ ||(逻辑或):前面为真时,后面不计算
  • ✅ &&(逻辑与):前面为假时,后面不计算

3. 实用技巧和应用场景

场景1:防止空指针解引用

c

// 安全的写法:如果 str 为 NULL,strlen(str) 不会执行
if (str != NULL && strlen(str) > 10) {
    printf("字符串长度大于10\n");
}

场景2:避免除零错误

c

// 安全的写法:如果 divisor 为0,不会执行除法
if (divisor != 0 && value / divisor > 5) {
    printf("结果大于5\n");
}

场景3:条件赋值

c

int x = 0;
int *ptr = NULL;

// 如果ptr不为空,才对其解引用
if (ptr != NULL && *ptr == 42) {
    x = 1;
}

场景4:简化条件判断

c

// 检查数组索引是否有效
if (index >= 0 && index < array_size && array[index] == target) {
// 安全地访问数组元素
}

十三、引用与解引用

十四、 C语言当中字符型常量与字符串变量的区别:

char c3=”A”; #这是错误的,试图将字符串赋值给字符型变量;

改为:char c3 = ‘A’;

字符型常量: 单引号

字符串常量: 双引号,以\0结尾。

十五、printf()函数常用的格式符、附加格式符说明

十六、循环嵌套问题:百钱买百鸡

十七。程序设计题

十八、C语言中,什么情况下不能使用“==”比较两个字符串,只能调用strcmp()函数进行处理呢?

在C语言中,任何时候都不应该使用 == 来比较两个字符串的内容,而必须使用 strcmp() 函数。

🚫 为什么 == 不能用于字符串比较?

根本原因:== 比较的是内存地址,而不是字符串内容

int main() {
char str1[] = “hello”;
char str2[] = “hello”;
char *str3 = “hello”;
char *str4 = “hello”;

// 使用 == 比较(错误!比较的是地址)
printf("str1 == str2: %d\n", str1 == str2);  // 输出 0 (不同地址)
printf("str3 == str4: %d\n", str3 == str4);  // 可能输出 1 (相同地址,编译器优化)

// 使用 strcmp 比较(正确!比较的是内容)
printf("strcmp(str1, str2): %d\n", strcmp(str1, str2));  // 输出 0 (内容相同)
printf("strcmp(str3, str4): %d\n", strcmp(str3, str4));  // 输出 0 (内容相同)

return 0;

}

情况1:字符数组

c

char str1[] = "hello";
char str2[] = "hello";

if (str1 == str2) {  // 总是 false!
    // 永远不会执行,因为 str1 和 str2 是不同的数组
    // 它们在不同的内存地址
}

情况2:字符指针

c

char *str3 = "hello";
char *str4 = "hello";

if (str3 == str4) {  // 可能 true,但不可靠!
    // 可能为真,因为编译器可能将相同的字符串常量优化到同一地址
    // 但这只是编译器的优化行为,不是语言标准保证的
}

✅ 正确的字符串比较方法

使用 strcmp() 函数

c

#include <string.h>

char str1[] = "hello";
char str2[] = "hello";
char str3[] = "world";

// 比较字符串内容
if (strcmp(str1, str2) == 0) {
printf("str1 和 str2 内容相同\n");
}

if (strcmp(str1, str3) != 0) {
printf("str1 和 str3 内容不同\n");
}

总结:在C语言中,只要你想比较两个字符串的内容是否相同,就必须使用 strcmp() 函数,永远不要使用 ==

发表回复