当前位置: 首页 > news >正文

每日奇难怪题(持续更新)

    1.以下程序输出结果是()

int main() {int a = 1, b = 2, c = 2, t;while (a < b < c) {t = a;a = b;b = t;c--;}printf("%d %d %d", a, b, c);
}

解析:a=1 b=2 c=2 a<b 成立 ,等于一个真值1 1<2 执行循环体 t被赋值为1 a被赋值2 b赋值1 c-- c变成1

a<b 不成立 则等于0 然后 0<c 成立 执行循环体 t被赋值为2 a赋值为1 b赋值为2 c-- c变成0

最后输入 1 2 0

2.以下程序输出结果是()

int main() {char a[] = "morming", t;int i, j = 0;for (i = 1; i < 7; i++)if (a[j] < a[i])j = i;t = a[j];a[j] = a[7];a[7] = a[j];puts(a);
}

解析:循环一开始循环时 a[0]<a[1] 成立 j赋值为1 又 a[1]<a[2] j又赋值为2 然后if语句不执行 一直循环到i=7

将a[7] "\0" 和 a[2] 交换位置 最后输出mo

3.以下程序输出结果是()

int main() {char ch[2][5] = { "693","825" }, * p[2];int i, j, s = 0;for (i = 0; i < 2; i++) p[i] = ch[i];for (i = 0; i < 2; i++)for (j = 0; p[i][j] < '0' && p[i][j] <= '9'; j += 2)s = 10 * s + p[i][j] - '0';printf("%d", s);}

由于"693"和"825"中的数字字符按照题目要求的规则转换并累加,得到的最终结果是6385。因此,程序的输出结果是6385。这个过程可以通过以下计算步骤详细说明:

  • 首先处理"693",取"6"和"3",转换为数值后累加到s上,得到63。

  • 然后处理"825",取"8"和"5",转换为数值后累加到s上,由于之前s的值为63,所以最终累加到

  • s上的值是85,因此最终s的值为6385

4.以下程序输出结果是()

#define P 3
#define S(a) P*a*a
int main() {int ar;ar = S(3 + 5);printf("%d", ar);
}

5.以下程序输出结果是()

#define N 3
#define Y(n) ((N+1)*n)int main() {int z;z = 2 * (N + Y(5 + 1));printf("%d", z);
}

define 产量首先被替换 N被替换成3  Y(n)==》(3+1)*n)  

然后我们看z = 2 * (N + Y(5 + 1)) 是怎么计算的?

N被替换成3 然后 Y(5+1) 是整体把n替换   所以z = 2*(3+(3+1)*5+1)=48 注意括号和乘法是优先计算的

6.以下程序输出结果是()

int main() {int a = 2, b = -1, c = 2;if (a < b)if (b < 0) c = 0;else c++;printf("%d", c);}

我们来看一下该代码输出什么? 3? 还是 2?

答案是2,为什么呢。在if分支语句中,但if没有加{ }时,后面只能执行一条语句;else会跟随他最近的if语句(第二个if); 因为a不小于b 则第二个if不执行 else也不执行 输出还是c=2没有变化

7.

#define SQR(X) X*X
main() { int a=16, k=2, m=1;
a/=SQR(k+m)/SQR(k+m);
printf("%d\n”,a); }

先做宏替换,把语句中的SQR(x)替换为x*x,特别注意,简单替换,不添加任何括号,替换后为:
main() { int a=16, k=2, m=1;
a/=k+m*k+m/k+m*k+m;
printf("%d\n”,a); }
现在我们来计算a值语句替换所有变量为数值:
a /= 2+1*2+1/2+1*2+1;
a /= 2+2+0+2+1;
a/=7;
除法之前a值16,而16/7=2,因此执行后a值是2,程序输出结果是2

8.执行以下语句,输出结果是 C 。

int x=2;printf(“%d”, ((x=4*5, x*5), x+20));A) 120 B) 100 C) 40 D) 20

逗号表达式,就是用逗号隔开的多个表达式。

逗号表达式,从左向右依次执行。整个表达式的结果是最后⼀个表达式的结果(不是一上来看最后一个,前面的表达式要依次左往右计算,再取最后的结果)

解析:先从左往右计算,x被赋值20 ,然后取最后的结果 20+20=40

以下程序的输出结果是( )。 

int main() {
char*s="12134211";int v[4]=0,0,0,0),k,i; 
for(k=0;s[k];k++) 
switch(s[k]) case’1’:i=0;case’2’:i=1;case’3’:i=2;case’4’:i=3;v[i]++: 
for(k=0;k<4;k++)printf("%d",v[k]);
}

 A.4 2 1 1B.0 0 0 8C.4 6 7 8D.8 8 8 8

本题考查switch,case语句,当k=0时,循环体成立,执行switch后表达式的值为’1’,执行case’1’,i的值为0,因为没有break语句,继续执行其后的语句,到最后一个语句时i的值为3,此时v[i]++,v[3]=1,接着执行k++后,k的值为1,当k=1时,循环成立,执行switch后的表达式的值为’2’,执行case’2’,i的值为1,因为没有break语句,继续执行其后的语句,到最后一个语句时,i的值为3,此时v[i]++,v[3]=2,接着执行k++后,k的值为2,依次下去,csse’4’也会执行,最后i的值一定为3,到v[3]=8时循环结束,而v[0]~v[2]的值一直没有变化,故选择B选项

9.

int w = 3;
int main() {int w = 10;printf("%d\n", fun(5) * w);
}
fun(int k)
{if (k == 0)return w;return(fun(k - 1) * k);
}
  1. 局部变量 w 的作用

    • 在 main 函数中,局部变量 w 被定义为 10,遮蔽了全局变量 w(值为 3)。
  2. 函数 fun 的定义

    • fun 函数使用全局变量 w。在函数 fun 的内部,变量 w 指的是全局变量 w,即 3,而不是 main 函数中的局部变量 w
  3. 函数 fun 的执行逻辑

    • fun(5) 调用会递归地计算 fun(4) * 5fun(4) 计算 fun(3) * 4,依此类推,直到 fun(0)
    • fun(0) 返回 w,即 3。因此,递归调用的计算过程是 fun(0) 返回 3,然后 fun(1) 返回 3 * 1 = 3fun(2) 返回 3 * 2 = 6fun(3) 返回 6 * 3 = 18fun(4) 返回 18 * 4 = 72fun(5) 返回 72 * 5 = 360
  4. 最终的输出

    • fun(5) 返回 360main 函数中计算 fun(5) * w 为 360 * 10 = 3600
int main() {int x = 023;printf("%d", --x);
}

023 是八进制 转成 十进制对应是 2*8^1+3*8^0=19 --x  则输出18

10.

int a[3][3] = { {2},{4},{6} };
int main() {int i, * p = &a[0][0];for (i = 0; i < 2; i++) {if (i == 0)a[i][i + 1] = *p + 1;else++p;printf("%d", *p);}
}

一开始将 数组a[0][0]的值2赋值给指针p  i=0时 不影响p i=1时++p ;所以最后输出23

fun(int x)
{static int a = 3;a += x;return(a);
}
int main() {int k = 2, m = 1, n;n = fun(k);n = fun(m);printf("%d", n);}

要注意静态变量a 它的值是等程序结束时才收回,所以a的值一直会保存知道程序结束;所以

一开始a = 5 然后 a变成6 最后返回 所以n=6 

11.

f(int a)
{int b = 0; static c = 3;a = c++, b++;return(a);
}
int main() {int a = 2, i, k;for (i = 0; i < 2; i++)k = f(a++);printf("%d", k);
}

这个题目太多干扰的变量,直接看c就行 c是静态变量,跳出函数不会收回他的值,一开始a = c++

先赋值 后加一  然后调用两次函数 第一次 a的值为3 第二次 a的值为4

12.

fun(s, n1, n2) int* s, n1, n2;
{int i, j, t;i = n1; j = n2;while (i<j){t = *(s + i);*(s + i) = *(s + j);*(s + j) = t;}
}
int main() {int a[10] = { 1,2,3,4,5,6,7,8,9,0 }, i, * p = a;fun(p, 0, 3);fun(p, 4, 9);fun(p, 0, 9);for (i = 0; i < 10; i++)printf("%d", *(a + i));printf("\n");
}

该程序主要实现数组中元素的顺序调换  第一次函数调用就是将元素1 4  2 3调换 变成4321

第二次函数调用 将5 0 6 9 ....调换 变成098765 第三次函数调用 将整一个数组调换 最后变成5678801234

13.

int main() {int a[] = { 1,2,3,4 }, i;int x = 0;for (i = 0; i < 4; i++) {sub(a, x);printf("%d", x);printf("\n");}}
sub(int* s, int y)
{static int t = 3;y = s[t]; t--;}

输出是 0 0 0 0 因为没有正确地传递 x 的地址,或者在 sub 函数中没有正确修改 x。请确保以下几点:

  1. 确保传递地址:在 main 函数中调用 sub 时,确保使用 &x 传递 x 的地址。

  2. 确保正确使用指针:在 sub 函数中,要确保通过解引用指针来修改 y 的值。

14.

#include <stdlib.h>
#include <stddef.h>
void fun(float* p1, float* p2, float* s)
{s = (float*)malloc(1, sizeof(float));*s = *p1 + *(p2++);
}
int main() {float a[2] = { 1.1,2.2 }, b[2] = { 10.0,20.0 }, * s = a;fun(a, b, s);printf("%f", *s);
}

fun 函数中对 s 的处理不当。将 s 的值修改为指向新分配的内存,但在 main 中仍然使用未更新的 s。 输出还是 1.100000

15.假设a和b为int型变量,则执行以下语句后,b的值为 __D____。

a=1;b=10; do {b-=a;a++; }while(b--<0); A.9B.-2C.-1D.8 

第一次循环 b=8 不小于0 结束循环 所以b为8

16.当运行以下程序时,从键盘输入:AhaMA  Aha

int main() {char s[80]; // 定义字符数组 schar c = 'a'; // 小写字母int i = 0; // 索引初始化// 输入字符串scanf("%s", s);// 遍历字符串while (s[i] != '\0') {if (s[i] == c) {s[i] = s[i] - 32; // 将小写字母转换为大写}else if (s[i] == c - 32) {s[i] = s[i] + 32; // 将大写字母转换为小写}i++; // 增加索引}// 输出结果puts(s);return 0;
}

1.要注意一个点 输入一个AhaMA  Aha 中间有个空格,所以他只读到第一个空格前的内容

2.while循环的目的就是将 a和A 的大小写互换 最终输出 ahAMa

17 以下程序输出什么?

int main() {struct p{char name[9];int age;};struct p class[10] = { "John",17,"Paul",19,"Marry",18,"Adam",16 };printf("%c", class[2].name[0]);}

输出字母M  结构体的输出   . 成员变量

18.假定下列程序的可执行文件名为prg . exe,则在该程序所在的子目录下输入命令行: prg hello good<回车〉后,程序的输出结果是()

main(int argc, char *argv[ ])

{int i; if(argc〈=0) return; for(i=1; i〈argc; i++) printf(“%c", *argv[i]); }

argc 计数参数的数量,包括程序名称。输入命令 prg hello good 后,argc 的值是 3(程序名、hellogood)。由于 i 从 1 开始循环到 argc - 1*argv[i] 将取每个参数的第一个字符。因此,输出为 h(来自 hello)和 g(来自 good),最终结果是 hg

19.下列程序输出结果是 15

#define MIN(x,y) (x)<(y)?(x):(y)
int main() {int i, j, k;i = 10; j = 15;k = 10 * MIN(i, j);printf("%d", k);
}

解析:错误解法 先算10<15?10:15 返回 10 k=10*10=100 

宏定义 是整体替换的 正确的解法: 10*10<15?10:15 100不小于15 返回15

20.以下语句定义正确的是 D

int main() {int a[1][4] = { 1,2,3,4,5 };float x[2][] = { {1},{2},{3} };long b[2][3] = { {1},{1,2},{1,2,3} };double y[][3] = { 0 };
}

语句 1 一行四列的二维数组   但是在赋值时,是五个元素,越界

语句 2 [][]  列数不能为空

语句 3 定义一个 二行三列的数组  赋值时为三行 报错

语句 4 正确

21.

这个值是基于结构体struct test的组成成分来计算的。具体来说,结构体struct test包含以下几个部分:

  • 一个整数类型成员int m1,通常占用2个字节(这取决于编译器和平台,但大多数现代编译器中,int类型占用4个字节,但考虑到题目可能是在特定的环境下提问,我们按照2个字节来计算)。
  • 一个字符类型成员char m2,占用1个字节。
  • 一个浮点数类型成员float m3,占用4个字节。
  • 一个共用体union uu,它包含两个选项:一个字符数组char u1‌:ml-citation{ref="1" data="citationList"}占用5个字节,和一个整数数组int u2‌:ml-citation{ref="2" data="citationList"}占用4个字节。由于共用体中的所有成员共享同一块内存区域,因此共用体的大小取决于其最大的成员,即5个字节。

根据上述分析,结构体struct test的总大小为:2(m1)+1(m2)+4(m3)+5(共用体)=122(m1)+1(m2)+4(m3)+5(共用体)=12个字节。因此,sizeof(struct test)的值是12‌


http://www.mrgr.cn/news/31434.html

相关文章:

  • 元器件封装
  • 深度学习——AE、VAE
  • Hadoop(YARN)
  • 深度学习:tensor的定义与维度
  • WebStorm 如何调试 Vue 项目
  • 软件设计师-操作系统
  • 360手机黑科技“位置穿越”功能修复 360位置穿越使用
  • 7个提升网站分页体验的 CSS 和 JavaScript 代码片段
  • 双token无感刷新
  • Python 类的继承
  • Generative Models from the perspective of Continual Learning【小白读论文】
  • 如何使用Spring Cloud Gateway搭建网关系统
  • 关于组织参加“2025第十四届国际生物发酵产品与技术装备展览会(济南)”的通知
  • Docker学习
  • 牛客小白月赛101(栈、差分、调和级数、滑动窗口)
  • Ansible部署openstack案例
  • mysql学习教程,从入门到精通,SQL 删除表(DROP TABLE 语句)(20)
  • [python3] 处理函数的重试
  • 【Linux庖丁解牛】—Linux基本指令(上)!
  • 数字签名和CA数字证书的核心原理
  • 最新植物大战僵尸杂交版V2.5版本【包含历史版本!持续更新!!】
  • 功耗中30分钟下载场景对平均电流标准的影响评估
  • 战神5/战神:诸神黄昏/God of War Ragnarok
  • go语言 数组和切片
  • k8s快速搭建+prometheus部署及使用(纯干货!!!)
  • 【二分搜索】二分搜索代码模板