一、关系操作符
1. switch语句
int func(int a)
{
int b;
switch (a)
{
case 1: b = 30;
case 2: b = 20;
case 3: b = 16;
default: b = 0;
}
return b;
}
则func(1) = ( )?
switch的每个case之后如果没有加break语句,当前case执行结束后,会继续执行紧跟case中的语句。
由func(1)可知,在调用func时形参a的值为1,switch(a)<==>switch(1),case 1被命中,因为该switch语句中所有分支下都没有增加break语句,因此会从上往下顺序执行,最后执行default中语句返回,即b = 0 。
2. 关系操作符
关于关系操作符说法错误的是?
A. C语言的关系操作符就是用来比较大小关系的
B. 关系操作符中判断是否相等使用==
C. ==操作符可以用来比较2个字符串是否相等
D. 关系操作符参与的关系表达式,通常返回0或1,表示真
==操作符不可以用来比较2个字符串是否相等。在C语言中,可以使用strcmp()函数来比较两个字符串是否相等:
// 使用strcmp()函数来比较两个字符串是否相等
#include <stdio.h>
#include <string.h>
int main()
{
char str1[50] = "Hello";
char str2[50] = "hello";
if (strcmp(str1, str2) == 0)
printf("两个字符串相同");
else
printf("两个字符串不同");
return 0;
}
还可以使用strcmp()函数来比较字符串的大小:
// 使用strcmp()函数比较str1和str2的大小,并根据结果打印出它们之间的关系
#include <stdio.h>
#include <string.h>
int main()
{
char str1[50] = "World";
char str2[50] = "hello";
if (strcmp(str1, str2) > 0)
printf("%s 在 %s 后面", str1, str2);
else if (strcmp(str1, str2) < 0)
printf("%s 在 %s 前面", str1, str2);
else
printf("%s 和 %s 相同", str1, str2);
return 0;
}
3. 奇偶项区分计算
计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
/*
思路:
1. 从上述表达式可以分析出
a. 该表达式主要由100项,基数项为正,偶数项为负
2. 设置一个循环从1~100,给出表达式中的每一项:1.0/i, 注意此处不能使用1,否则结果全部为0
然后使用flag标记控制奇偶项,奇数项为正,偶数项为负
然后将所有的项相加即可
*/
#include <stdio.h>
int main()
{
int i = 0;
double sum = 0.0;
int flag = 1;
for(i=1; i<=100; i++)
{
sum += flag*1.0/i;
flag = -flag;
}
printf("%lf\n", sum);
return 0;
}
二、break和continue
辗转相除法求最大公约数
给定两个数,求这两个数的最大公约数
例如:
输入:20 40
输出:20
#include <stdio.h>
int main()
{
int a = 1, b = 1;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
//辗转相除法
while (b != 0) {
int tmp = a % b;
a = b;
b = tmp;
}
printf("这两个整数的最大公约数是 %d\n", a);
return 0;
}
示例:18和24的最大公约数 第一次:tmp = a%b = 18%24 = 6 a = 18 b = 6 第二次:tmp = a%b = 18%6 = 0 a = 6 b = 0 第三次:b = 0 循环结束 此时a中的内容即为两个数中的最大公约数,即为6。
三、一维数组
1. 逗号运算符
使用逗号运算符是为了把几个表达式放在一起。
整个逗号表达式的值为系列中最后一个表达式的值。
表达式1, 表达式2
从本质上讲,逗号的作用是将一系列运算按顺序(先求解表达式 1,再求解表达式 2。整个逗号表达式的值是表达式 2 的值。最右边的那个表达式的值将作为整个逗号表达式的值,其他表达式的值会被丢弃)执行。
#include <stdio.h>
int main()
{
int i, j;
j = 10;
i = (j++, j+10, 99+j);
printf("%d\n", i);
return 0;
}
如上面的示例,j 最初的值为 10,然后自增到 11,这时 j 的值就为 11,然后再计算第二个表达式 j+10,最后 j(j 为 11) 再加上 99,最后 i 为 最后一个表达式的值 99+j,即 99+ 11=110,输出结果为110。
2. sizeof和strlen函数计算数组长度的方式
示例一
#include <stdio.h>
int main()
{
char str[] = "c:\talk saxy.mp4";
printf("%d %d\n", sizeof(str), strlen(str));
return 0;
}
C语言中,反斜杠(\)通常用于表示转义字符序列,如"\n"表示换行符,"\t"表示制表符等等。
该字符串实际上包含了以下内容: "c: alk saxy.mp4"(':'后面有一个空格)。
在这个字符串中,有15个可见字符和1个空字符('\0'),用于表示字符串的结束。
sizeof(str)
返回的是字符数组str
的大小,它包括了数组中的字符以及一个用于表示字符串结尾的空字符('\0')。字符串包括15个字符,再加上一个结尾的空字符,又因为每个 char 字符在该系统中占用 1 个字节,所以sizeof(str)
返回16。
strlen(str)
返回的是字符串的实际长度,即不包括结尾的空字符('\0')。因此,对于该字符串,strlen(str)
返回15,因为它只计算了字符串中的15个字符。
示例二
int main()
{
char acX[] = "abcdefg";
char acY[] = { 'a','b','c','d','e','f','g' };
printf("%zd %zd\n", sizeof(acX), sizeof(acY));
printf("%d %d\n", strlen(acX), strlen(acY));
return 0;
}
(1)输出内容(第一行):8 7
sizeof(acX)
返回的是acX
字符数组的大小,这包括了字符串"abcdefg"以及结尾的空字符('\0'),所以它的大小是8字节(7个字符 + 1个空字符)。
sizeof(acY)
返回的是acY
字符数组的大小,这是明确指定的,它包含了7个字符,所以它的大小是7字节。
(2)输出内容(第二行):7 42
strlen(acX)
返回的是acX
中非空字符的数量,也就是7,因为它不包括结尾的空字符。
strlen(acY)
返回的是acY
中非空字符的数量,然而acY
并没有以空字符结尾,因此strlen(acY)
会继续查找内存,直到找到一个空字符('\0'),这可能导致strlen(acY)
返回的值不是预期的7,而是一个较大的值,这里是42。
3. 变长数组
在C语言中,以下哪个选项描述了变长数组(Variable Length Array,VLA)的特点?
A. 变长数组的大小在编译时确定,不能改变。
B. 变长数组的大小可能在运行时确定,比如使用变量来指定数组大小,一旦确定大小后,它的大小是固定的,无法改变。
C. 一旦确定大小后,它的大小是固定的,无法改变
D. 变长数组只能用于存储字符类型的数据。
变长数组( variable-length array),C语言术语,也简称VLA。是指用 整型变量或表达式声明或定义的数组 ,而不是说数组的长度会随时变化,变长数组在其生存期内的长度同样是固定的 。
代码示例:
int n;
scanf ("%d", &n);
int array[n];
注意上述语法在C99之前是不支持的。
A选项错误:编译时无法确定,编译时候编译器不知道n是什么值,n的值要等到程序运行起来后,用户输入之后n的值确定了,才能确定数组的大小
B选项错误:说法不严谨,一定是在运行时确定大小的,而不是可能
C选项正确
D选项错误:存储什么类型数据,看定义时候给数组名前放什么类型,比如int a[n]就是存放int类型 short a[n]就是存在short类型