C语言的一些小知识(四)
一、认识scanf()输入
当你运行下面这段程序后输入55566 7777abc,i,j,name会返回什么结果呢?
int i;
float j;
char name[20];
scanf("%2d%f%s",&i,&j,name);
在C语言中,`scanf`函数用于从标准输入(通常是键盘)读取格式化的输入。`scanf`函数的格式字符串决定了如何解析输入。
这里的`scanf`格式字符串是`"%2d%f%s"`,它的含义如下:
- `%2d`:读取一个最多两位的整数。如果输入的数字超过两位,它只会读取前两位。
- `%f`:读取一个浮点数。
- `%s`:读取一个字符串,直到遇到空白字符(如空格、制表符或换行符)。
当你运行这段程序并输入`55566 7777abc`时,`scanf`会按照上述规则解析输入:
1. `%2d`会读取前两个数字`55`,因此`i`的值将是`55`。
2. `%f`会读取接下来的浮点数`566`,因此`j`的值将是`566.0`(因为`scanf`读取浮点数时会忽略前面的整数部分,只读取小数点后的数字,如果没有小数点,则默认为`0.0`)。
3. `%s`会读取剩余的字符串`7777abc`,直到遇到下一个空白字符。由于输入中没有更多的空白字符,`name`将包含整个字符串`"7777abc"`。
因此,程序运行后,`i`的值将是`55`,`j`的值将是`66.0`,`name`将包含字符串`"7777abc"`。
下面再举一个例子:
#include <stdio.h>int main() {
int i,a=123;
scanf("%2d",&i);
printf("i=%2d\n",i);
printf("a=%2d\n",a);return 0;
}
123123
i=12
a=123
请按任意键继续. . .
二、fun( ( expl,exp2 ), ( exp1,exp2,exp3));含有的实参个数
在C语言中,函数调用时,实参的个数是由逗号分隔的表达式的数量决定的。在给定的函数调用语句中:
fun( ( expl,exp2 ), ( exp1,exp2,exp3));
首先,我们来看括号内的表达式:
1. `(exp1,exp2)`:这是一个逗号表达式,它将执行两个表达式 `exp1` 和 `exp2`,但结果会是 `exp2` 的值。因此,这个表达式作为一个整体,只算作一个实参。
2. `(exp1,exp2,exp3)`:同样,这也是一个逗号表达式,它将执行三个表达式 `exp1`、`exp2` 和 `exp3`,但结果会是 `exp3` 的值。因此,这个表达式作为一个整体,也只算作一个实参。
所以,尽管在每个逗号表达式中有多个子表达式,但整个逗号表达式只算作一个实参。因此,这个函数调用语句中总共有两个实参。
三、你知道typedef int T[10];的含义吗?
下面我给你一段程序,你能写出与上述定义完全等价的说明语句吗?
typedef int T[10];
T a[20];
以下是对这段代码的分析:
1.typedef int T[10];`这行代码定义了一个新的类型别名`T`,`T`代表一个包含 10 个`int`类型元素的数组类型。
2. T a[20];这里声明了一个名为`a`的变量,它是一个包含 20 个元素的数组,而每个元素的类型是`T`,即包含 10 个`int`类型元素的数组。 所以,最终`a`是一个二维数组,有 20 行,每行有 10 个`int`类型的元素。例如,可以通过`a[i][j]`的方式访问其中的元素,其中`0 <= i < 20`,`0 <= j < 10`。
现在你会了吗?下面公布答案:
int a[20][10];
四、你了解结构体类型吗?
ST是结构体变量吗?struct ST 是结构体变量吗?NEW是啥?这三者有啥区别?
typedef struct ST{long a;int b;char c[2];
} NEW;
“ST
” 是一个结构体标签名,当使用 “struct ST
” 这种形式时,可以声明该结构体类型的变量。例如 “struct ST myStruct;
”。
“NEW
” 是通过 “typedef
” 关键字为结构体 “struct ST{ long a; int b; char c[2]; }
” 定义的一个别名。使用 “NEW
” 可以更简洁地声明该结构体类型的变量,比如 “NEW myStruct;
”。
五、自增/减运算符必须用于整形变量?
下面是将整型、浮点型和字符型变量的自增/减运算合并在一个C语言程序中的示例:
#include <stdio.h>int main() {int a = 5; // 定义一个整型变量afloat b = 5.5; // 定义一个浮点型变量bchar c = 'A'; // 定义一个字符型变量c// 打印原始值printf("原始值: a = %d, b = %f, c = %c (ASCII: %d)\n", a, b, c, c);// 使用前置自增运算符++a;++b;++c;printf("前置自增: a = %d, b = %f, c = %c (ASCII: %d)\n", a, b, c, c);// 使用后置自增运算符a++;b++;c++;printf("后置自增: a = %d, b = %f, c = %c (ASCII: %d)\n", a, b, c, c);// 使用前置自减运算符--a;--b;--c;printf("前置自减: a = %d, b = %f, c = %c (ASCII: %d)\n", a, b, c, c);// 使用后置自减运算符a--;b--;c--;printf("后置自减: a = %d, b = %f, c = %c (ASCII: %d)\n", a, b, c, c);return 0;
}
程序输出示例:
原始值: a = 5, b = 5.500000, c = A (ASCII: 65)
前置自增: a = 6, b = 6.500000, c = B (ASCII: 66)
后置自增: a = 7, b = 7.500000, c = C (ASCII: 67)
前置自减: a = 6, b = 6.500000, c = B (ASCII: 66)
后置自减: a = 5, b = 5.500000, c = A (ASCII: 65)
这个程序首先定义了三个变量:一个整型变量a
,一个浮点型变量b
,和一个字符型变量c
。然后,它使用自增和自减运算符来修改这些变量的值,并在每次操作后打印出变量的当前值和类型。这样的程序可以帮助理解不同数据类型在使用自增/减运算符时的行为。