C语言练习题 答案存在疑惑

12题for循环为什么答案是10,另外我对于for循环不是很了解,为什么有时候for循环输出的是多个值,有时候却输出最后一个值;
13题输入格式没有空格,如果输入数据有空格不会抢占格式位吗;
17题A选项哪里不对了;
20题C选项为什么错误,B难道不是错的吗while 后面多了分号;
26题B为什么是正确的,空格不多吗;
4题C为什么错了,八进制哪里不对了;
5题D是十六进制,不应该是一到两位十六进制数吗?它都有四位了,不应该是错的吗?

img


img


img


img

12题:for(i=0; i<10; i++) 各语句执行顺序如下:

  1. 先 i=0 且仅执行一次
  2. 判断 i<10,如果满足条件执行循环体,本题为空什么都不做
  3. i++,然后再执行2,满足条件还会执行3,否则就退出了。
    i 增加到10以后,不满足2,退出,所以输出10

13题:scanf函数使用格式字符串控制输入数据的格式,格式字符串中的各个格式控制字符用来指定要读入的数据类型和数据之间的分隔符。对于%d格式控制字符来说,scanf函数会自动跳过输入数据之间的空白字符,例如空格、制表符和换行符,直到读取到下一个非空白字符为止。而对于%c格式控制字符来说,scanf函数会读取并返回下一个输入字符,包括空白字符。A 和 C 都对。
10a20b 与格式字符串匹配
10a 20b 读取a2时自动跳过空格
其它地方加了空格,导致输入错乱,都是错误的。
.
17题:有问题,void fun()就没有返回。
20题:都没错,while(0); w=7; 是两个语句,前者while空循环体,且条件也为假
26题:和13题一样,会跳过空格
4题:使用前缀0表示一个八进制数
5题:AD都是16进制
.
附上第13题的运行截图,为你那个答案平反:

img

12题for循环为什么答案是10,另外我对于for循环不是很了解,为什么有时候for循环输出的是多个值,有时候却输出最后一个值;
for后面有一个分号,也就是说for循环执行了分号这条空语句。等for循环完了,i就为10,所以输出10
13题输入格式没有空格,如果输入数据有空格不会抢占格式位吗;
%d会自动跳过数字前的一个或多个空格/Tab字符/回车符/换行符,%c不会跳过任何字符,会读取紧接上一个输入域后面的第一个字符(包括空格/Tab字符/回车符/换行符)
17题A选项哪里不对了;
我也觉得是A
20题C选项为什么错误,B难道不是错的吗while 后面多了分号;
把对应语句实际放到编译环境下编译一下看哪句报错。
26题B为什么是正确的,空格不多吗;
%d会自动跳过数字前的一个或多个空格/Tab字符/回车符/换行符
4题C为什么错了,八进制哪里不对了;
八进制是0开头,不是o开头
5题D是十六进制,不应该是一到两位十六进制数吗?它都有四位了,不应该是错的吗?
BC是10进制,所以是错的。0xaaaa是对的,0xaaaaaaaa也是对的。

12题

img


13题
对于数字,它们通常不需要在后面加上空格,因为数字类型的数据类型之间是不需要使用空格分隔的,而当字符与其他数据类型(例如字符串)组合时,如果没有空格来分隔它们,它们可能会被解释为一个单词或符号,导致输出结果不符合预期。你可以理解为这是不成文规定(理解!!!)
17题
当函数参数是简单变量时,按值传递的方式会将实参的值复制一份,传递给形参。因此,函数内部对形参的修改不会影响实参的值。但是,当函数参数是指针类型时,按地址传递的方式会将实参的地址传递给形参,函数内部对形参指向的地址的修改会影响实参的值。因此,在函数中修改指针类型参数可以改变实参的值。C语言中,函数参数传递的方式取决于参数类型,而不是参数位置,多多参与代码实践可能会有利与理解,总之就是太绝对的不可行
20题
我认为这道题可能想考察的是逻辑而非代码本事,按代码本身来说都是错的,没一个格式是对的,c选项的逻辑可能会导致无限循环
26题
这个b在这里有空格和没空格是一样的,字符串必须要有,数字可有可无,跟13题一样的,理解理解,还不懂可以私信我
4题
这里的5L表示长整型(long)的整数常量5
而o13嘛 ,你都看出来是字母了,哪有字母o来表示数的啊,这怎么也是0(零!!!!)x13十六进制或者直接13十进制
5题
0xaaaa是一个合法的十六进制数,在C语言中可以用来表示数43690。
在C语言中,以0x开头的整数通常表示的是十六进制数,其后跟的是十六进制的数字(0-9或a-f),尝试理解一下或者查阅一下其他文献,但-16一定是错的,为什么呢,-16可以表示负16,十进制,所以排除法它一定是错的
能力有限理解一下吧,或者等其他人更好的答案,吃饭去啦

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7407923
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言练习题:三色球分组,编程计算三色球问题。若一个口袋中放有12个球,其中有3个红色的,3个白色的,6个黑色的,从中任取8个球,问共有多少种不同的颜色搭配?请用穷举法编程求解。
  • 除此之外, 这篇博客: 纸牌游戏(C语言实现)中的 星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人 手中的牌全部出完时,游戏结束,对手获胜。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • **

    #include <stdio.h>
    #include <stdlib.h>
    struct queue{
    	int head;
    	int tail;
    	int data[1000];
    };
    struct stack{
    	int top;
    	int data[10];
    };
    int main()
    {
    	int i,t;
    	struct queue q1,q2;
    	struct stack s;
    	int book[10];
    	
    	q1.head=1;q1.tail=1;
    	q2.head=1;q2.tail=1;
    	
    	s.top=0;
    	for(i=1;i<=9;i++)
    		book[i]=0;
    		
    	for(i=1;i<=6;i++){
    		scanf("%d",&q1.data[q1.tail]);
    		q1.tail++;
    	}
    	for(i=1;i<=6;i++){
    		scanf("%d",&q2.data[q2.tail]);
    		q2.tail++;
    	}
    	while(q1.head<q1.tail&&q2.head<q2.tail)
    	{
    		t=q1.data[q1.head];
    		if(book[t]==0){
    		q1.head++;//q1出牌,即出队列,头指针+1
    		s.top++;//桌面上的牌为栈,仅有头指针操作 
    		s.data[s.top]=t;
    		book[t]=1;
    		}
    		else{
    		q1.head++;
    		q1.data[q1.tail]=t;
    		q1.tail++;
    		while(s.data[s.top]!=t)
    		{
    			book[s.data[s.top]]=0;
    			q1.data[q1.tail]=s.data[s.top];
    			q1.tail++;
    			s.top--;
    		}
    		}
    		t=q2.data[q2.head];
    		if(book[t]==0)
    		{
    			q2.head++;
    			s.top++;
    			s.data[s.top]=t;
    			book[t]=1;
    		}
    		else
    		{
    			q2.head++;
    			q2.data[q2.tail]=t;
    			q2.tail++;
    			while(s.data[s.top]!=t)
    			{
    				q2.data[q2.tail]=s.data[s.top];
    				book[s.data[s.top]]=0;
    				q2.tail++;
    				s.top--;
    			}
    		}
    	}
    	if(q2.head==q2.tail)
    	{
    		printf("q1 win\n");
    		for(i=q1.head;i<q1.tail;i++)//tail始终指向结尾的下一个位置
    			printf("%d ",q1.data[i]);
    	}
    	else
    	{
    		printf("q2 win\n");
    		for(i=q2.head;i<q2.tail;i++)
    			printf("%d ",q2.data[i]);
    	}
    	return 0;
    }