• C语言|初始C语言常见问题集(2)


    目录

    常量

    类型一:实数

    类型二:整形常量

    scanf

    类型一:

    类型二:

    赋值

    类型一:

    define

    类型一:

    类型二:

    switch

    类型一:

    结构体

    类型一:

    类型二:


    常量

    类型一:实数

    1. //下列实数是否合法
    2. .1e0
    3. 3.0e0.2
    4. E9
    5. 9.12E

    在C语言中,实数有两种形式:十进制数形式指数形式

    十进制:例如:0.123、.123、123.、0.0等都是合法实数常量。注意:小数形式表示的实数常量必须要加小数点

    指数形式:使用"e"或“E”后跟一个整数表示以10为底的幂数。

    如:0.23*(10的1次方)可以写为——0.23e1或0.23E1

    所以要注意,e或E之前必须要有数字,且e或E后面的指数必须为整数。

    由此我们可知,只有.1e0是正确的

    类型二:整形常量

    1. //下列那个数据常量是正确的
    2. 115L
    3. 0118
    4. o115
    5. //115是正确的

    十进制:为正负数加数字部分,数字部分不能以0开头

    八进制:数字部分要以0开头,如0123(八进制中各位不能有>=8的数)

    十六进制:数自部分要以0x开头,如0x123

    • 其中八进制和十六进制整形常量一般表示无符号整数,所以前面不应该带正负号

    长整型:后缀L或I

    无符号型:后缀U或u

    scanf

    类型一:

    1. //判断下列哪种输入方式正确
    2. #include
    3. main()
    4. {
    5. int a1, a2;
    6. char c1, c2;
    7. scanf("%d%c%d%c", & a1, & c1, & a2, & c2);
    8. printf("%d,%c,%d,%c", a1, c1, a2, c2);
    9. }
    10. //1.
    11. 12 a 34 b
    12. //2.
    13. 12a34b

    第二种是正确的

    输入类型分别为int、char、int、char,在输入多个数据时,格式种没有非格式字符(在sanf的""中并未将各输入类型赋封开)

    按照第一种方法输入,变量a为char类型,接收到的字符为空格,与原意不符

    类型二:

    1. //下列输入格式是什么
    2. #include
    3. main()
    4. {
    5. float a1;
    6. char c1;
    7. scanf("%f", &a1);
    8. scanf("%c", &c1);
    9. printf("%f,%c", a1, c1);
    10. }

    整数字符(中间不添加任何元素)

    第二个输入的变量为字符变量,在第一个变量后添加任何符号包括换行符,都会被字符型变量接收。

    不建议这样写,应该在scanf之间增加一个函数接收内存缓冲器中多余的元素

    赋值

    类型一:

    1. //下式为什么是错的?
    2. a = (b=4) = 3;

    (b=4)是一个无法改变的表达式,无法将常量或是变量赋给无法表达的表达式

    define

    类型一:

    1. //最后的输出值是?
    2. #include
    3. #define S(x) 4*(x)*x+1
    4. #define S1(x) 4*x*x+1
    5. main()
    6. {
    7. int k=5,j=2;
    8. printf("%d\n",S(k+j));
    9. printf("%d\n",S1(k+j));
    10. }

    首先我们要明白,define是简单的文本替换

    S(k+j):4*(k+j)*k+j+1       最终值为143

    S(k+j):4*k+j*k+j+1          最终值为33

    类型二:

    1. //以下程序的输出值
    2. #include
    3. #define PT 3.5;
    4. #define S(x) PT*x*x;
    5. int main()
    6. {
    7. int a=1,b=2;
    8. printf("%4.1f\n",S(a+b));
    9. }

    程序错误,无法输出

    宏定义变量名PT为  3.5;    代入S(x)为

    3.5;*x*x;   表达式错误,不需要分号

    switch

    类型一:

    1. //下面那个switch语句正确
    2. float x = 1.5;
    3. int a = 1, b = 3, c = 2;
    4. //1.
    5. switch (a+b)
    6. {
    7. case 1:
    8. printf("*\n");
    9. case 2:
    10. printf("**\n");
    11. }
    12. //2.
    13. switch ((int)x);
    14. {
    15. case 1:
    16. printf("*\n");
    17. case 2:
    18. printf("**\n");
    19. }
    20. //3.
    21. switch (x)
    22. {
    23. case 1:
    24. printf("*\n");
    25. case 2:
    26. printf("**\n");
    27. }
    28. //4.
    29. switch (a+c)
    30. {
    31. case 1:
    32. printf("*\n");
    33. case b:
    34. printf("**\n");
    35. }

    switch后的括号中是存放表达式的,写为两个变量相加没有问题,但必须为整型表达式或字符,浮点型和字符串是不行的,3错误。

    case后的括号中是存放常量表达式的,不能将变量带入,4错误。

    switch()后一个语句并没有结束,不能在后面直接使用分号

    结构体

    类型一:

    1. //求最终输出值
    2. #include
    3. struct S
    4. {
    5. int a,b;
    6. }
    7. data[2]={10,100,20,200};
    8. main()
    9. {
    10. struct S p=data[1];
    11. printf("%d\n",++(p.a));
    12. }

    data是类型为struct S的数组名,结构体中存放有两个变量,data数组中存放有两组数,其中,10和20是变量x的值,100和200是变量b1的值。

    主函数中创建一个结构体类型的变量,并把data数组中第二组数赋给它,所以,p.a==20,p.b==200,最终输出为p.a+1为21

    类型二:

    1. struct {
    2. char mark[12];
    3. int num1;
    4. double num2;
    5. }t1,t2;
    6. //判断是否成立
    7. t1 = t2;
    8. t1.mark = t2.mark;
    9. t1.num1 = t2.num1;
    10. t1.num2 = t2.num2;

    t1.mark = t2.mark是错误的,C语言中不能直接给结构体中的数组赋值

    数组名表示地址,可以看作一个常量,无法给常量直接赋值。

    结构体变量是一个变量,可以给它赋值

  • 相关阅读:
    H3C交换机环路保护
    用连续内存空间实现线性表
    SpringBoot 常用注解
    诚迈科技董事长王继平出席中国(太原)人工智能大会并发表演讲
    数字孪生技术解决方案助力智慧核电建设
    3、网关和BFF
    292.Nim游戏 | 877.石子游戏 | 319.灯泡开关
    【yolo训练数据集】标注好的垃圾分类数据集共享
    GNSS模块如何应用在“监控案例”中
    大部分人都不知道产品说明书有这些特点
  • 原文地址:https://blog.csdn.net/m0_52094687/article/details/126682559