一、逗号表达式
说明
在C语言中,逗号表达式是一种特殊的表达式,它允许你将多个表达式串联起来,并且会按照从左到右的顺序依次计算每个表达式,但整个表达式的值是最后一个表达式的值。
一般形式如下:
expression1, expression2, expression3, ..., expressionN;
其中,“expression1, expression2, ..., expressionN“是任意数量的表达式,它们将按照顺序被计算。但是,只有最后一个表达式 “expressionN” 的值会被用作整个逗号表达式的值。
例子
#include <stdio.h>
int main() {
int a = 5, b = 10, c;
c = (a++, b++, a + b); // 逗号表达式
printf("a = %d, b = %d, c = %d\n", a, b, c);
return 0;
}
在这个例子中,逗号表达式 `(a++, b++, a + b)` 计算的顺序如下:
1. “a++”被计算,”a“ 的值增加1,但表达式的值是 `a` 增加前的值,即5。
2. ”b++“ 被计算,“b” 的值增加1,但表达式的值是 ”b“ 增加前的值,即10。
3. “a + b”被计算,此时 `a` 和 `b` 都已增加1,所以表达式的值是6 + 11 = 17。
因此,最终 `c` 的值是17。
二、用强制类型转换将char转换成double可以吗?
例子
#include <stdio.h>
int main() {
char c = '3'; // 假设我们有一个字符 '3'
double d;
// 将字符 '3' 转换为数字 3.0
d = (double)c - (double)'0';
printf("The character '%c' as a double is %f\n", c, d);
return 0;
}
在这个例子中,我们首先定义了一个 char
类型的变量 c
并赋值为 '3'
。然后,我们通过强制类型转换将 c
转换为 double
类型,并且减去字符 '0'
的 double
类型值。这是因为在ASCII码表中,数字字符 '0'
到 '9'
是连续的,所以 '3'
的ASCII码值减去 '0'
的ASCII码值就得到了数字3。
三、''和'\61'到底哪个是字符常量
(1)在C语言中,字符常量是用单引号(')括起来的单个字符。字符常量在C语言中通常用于表示单个字符,它们在内存中存储为该字符的ASCII码值。以下是一些关于字符常量的要点:
1. **表示方法**:字符常量必须用单引号括起来,例如 `'A'`、`'B'`、`'5'`、`';'` 等。
2. **数据类型**:字符常量在C语言中是 `char` 类型。
3. **ASCII值**:字符常量在内存中存储的是对应的ASCII码值。例如,字符 `'A'` 的ASCII码值是65。
4. **转义序列**:在单引号中,也可以使用特定的转义序列来表示特定的字符,如换行符(`\n`)、制表符(`\t`)、单引号(`\'`)、反斜杠(`\\`)等。
5. **字符字面量与字符串字面量的区别**:字符字面量是单个字符,而字符串字面量是由双引号括起来的字符序列,如 `"Hello"`。
6. **字符常量的范围**:在C语言中,字符常量的范围是从0到255(对于标准ASCII码),这取决于所使用的字符编码。
7. **字符常量的使用**:字符常量可以用于数组、变量赋值、条件判断等。
下面是一个使用字符常量的简单示例:
#include <stdio.h>
int main() {
char letter = 'A'; // 定义一个字符常量并赋值
char newline = '\n'; // 定义一个换行符字符常量
char backslash = '\\'; // 定义一个反斜杠字符常量
printf("%c%cThis is on a new line.%c", letter, newline, backslash);
return 0;
}
在这个例子中,我们定义了三个字符常量:`letter` 存储字符 `'A'`,`newline` 存储换行符,`backslash` 存储反斜杠字符。然后我们使用 `printf` 函数打印它们。输出将会是:
A
This is on a new line.\
请注意,由于反斜杠是转义字符,所以在打印时它后面紧跟的字符会被解释为转义序列的一部分,除非它自身被转义(如 `\\` 表示字面量的反斜杠)。
(2)在C语言中,`\61` 是一个八进制的转义序列,它代表ASCII码值为 61 的字符。八进制转义序列以反斜杠(`\`)开始,后跟最多三个八进制数字(0-7)。在这个例子中,`61` 是一个八进制数,它等价于十进制数 97。
因此,`\61` 表示的字符是小写字母 'a',因为 'a' 的ASCII码值是 97。
这里是一个简单的示例,展示如何使用这个转义序列:
#include <stdio.h>
int main() {
char ch = '\61'; // 使用八进制转义序列定义字符 'a'
printf("The character is: %c\n", ch);
return 0;
}
当你运行这个程序时,它会输出:
The character is: a
这证明了 `\61` 确实表示小写字母 'a'。
四、判断"abc\045D\\\0"; "0def\081"; "jkl\\\09A8"; "x\nyz\6"; 的长度
下面我们通过用strlen()函数写一段代码,来解决这个问题。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "abc\045D\\\0";
char str2[] = "0def\081";
char str3[] = "jkl\\\09A8";
char str4[] = "x\nyz\6";
printf("Length of \"abc\\045D\\\\\\0\" is %lu\n", strlen(str1));
printf("Length of \"0def\\081\" is %lu\n", strlen(str2));
printf("Length of \"jkl\\\\\\09A8\" is %lu\n", strlen(str3));
printf("Length of \"x\\nyz\\6\" is %lu\n", strlen(str4));
return 0;
}
在C语言中,"abc\045D\\\0";可以分解成下面这些字符'a'、'b'、'c'、'\045'、'D'、'\'、'\0',其中'\0'在计算字符串长度的时候不计算在内。
在C语言中,"0def\081";可以分解成下面这些字符'0'、'd'、'e'、'f'、'\0',你可能会问为啥不是'\081',在上面的讲解中我们都知道八进制转义序列以反斜杠(`\`)开始,后跟最多三个八进制数字(0-7)。
在C语言中,"jkl\\\09A8"; 可以分解成下面这些字符'j'、'k'、'l'、'\'、'\0'。
在C语言中,"x\nyz\6";可以分解成下面这些字符'x'、'\n'、'y'、'z'、'\6'。
所以以上代码的输出结果是:
Length of "abc\045D\\\0" is 6
Length of "0def\081" is 4
Length of "jkl\\\09A8" is 4
Length of "x\nyz\6" is 5
请按任意键继续. . .
五、有以下程序描述 double a=22;int i=0; a=a++,i++;a的值是多少?
a=a++,i++;和 a=(a++,i++);有区别吗?
下面是a=a++,i++;的程序
#include <stdio.h>
int main() {
double a = 22;
int i = 0;
// 执行逗号表达式
a = a++, i++;
// 打印结果
printf("a = %f\n", a);
printf("i = %d\n", i);
return 0;
}
运行结果如下:
a = 23.000000
i = 1
请按任意键继续. . .
下面是a=(a++,i++);的程序
#include <stdio.h>
int main() {
double a = 22;
int i = 0;
// 执行逗号表达式
a = (a++, i++);
// 打印结果
printf("a = %f\n", a);
printf("i = %d\n", i);
return 0;
}
运行结果如下:
a = 0.000000
i = 1
请按任意键继续. . .