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

目录

常量

类型一:实数

类型二:整形常量

scanf

类型一:

类型二:

赋值

类型一:

define

类型一:

类型二:

switch

类型一:

结构体

类型一:

类型二:


常量

类型一:实数

//下列实数是否合法
.1e0
3.0e0.2
E9
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是正确的

类型二:整形常量

//下列那个数据常量是正确的
115L
0118
o115

//115是正确的

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

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

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

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

长整型:后缀L或I

无符号型:后缀U或u

scanf

类型一:

//判断下列哪种输入方式正确
#include <stdio.h>
main()
{  
	int a1, a2;
	char c1, c2;
	scanf("%d%c%d%c", & a1, & c1, & a2, & c2);
	printf("%d,%c,%d,%c", a1, c1, a2, c2);
}

//1.
12 a 34 b

//2.
12a34b

第二种是正确的

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

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

类型二:

//下列输入格式是什么
#include <stdio.h>
main()
{  
	float a1;
	char c1;
	scanf("%f", &a1);
	scanf("%c", &c1);
	printf("%f,%c", a1, c1);
}

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

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

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

赋值

类型一:

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

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

define

类型一:

//最后的输出值是?
#include<stdio.h>
#define S(x) 4*(x)*x+1
#define S1(x) 4*x*x+1
main()
{
    int k=5,j=2;
    printf("%d\n",S(k+j));
    printf("%d\n",S1(k+j));
}

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

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

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

类型二:

//以下程序的输出值
#include <stdio.h>
#define PT 3.5;
#define S(x) PT*x*x;
int main()
{ 
	int a=1,b=2;
	printf("%4.1f\n",S(a+b));
}

程序错误,无法输出

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

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

switch

类型一:

//下面那个switch语句正确
	float x = 1.5;
	int a = 1, b = 3, c = 2;

//1.
	switch (a+b)
	{
	case 1:
		printf("*\n");
	case 2:
		printf("**\n");
	}

//2.
	switch ((int)x);
	{
	case 1:
		printf("*\n");
	case 2:
		printf("**\n");
	}

//3.
	switch (x)
	{
	case 1:
		printf("*\n");
	case 2:
		printf("**\n");
	}

//4.
	switch (a+c)
	{
	case 1:
		printf("*\n");
	case b:
		printf("**\n");
	}

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

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

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

结构体

类型一:

//求最终输出值
#include<stdio.h>
struct S
{
    int a,b;
}
data[2]={10,100,20,200};
main()
{
    struct S p=data[1];
    printf("%d\n",++(p.a));
}

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

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

类型二:

struct {
    char mark[12];
    int num1;
    double num2;
}t1,t2;
//判断是否成立
t1 = t2;
t1.mark = t2.mark;
t1.num1 = t2.num1;
t1.num2 = t2.num2;

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

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

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

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榶曲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值