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

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

cpp 复制代码
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.以下程序输出结果是()

cpp 复制代码
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.以下程序输出结果是()

cpp 复制代码
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.以下程序输出结果是()

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

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

cpp 复制代码
#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.以下程序输出结果是()

cpp 复制代码
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没有变化

cpp 复制代码
#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 。

cpp 复制代码
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

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

cpp 复制代码
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选项

cpp 复制代码
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) * w360 * 10 = 3600
cpp 复制代码
int main() {
    int x = 023;
    printf("%d", --x);
}

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

cpp 复制代码
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

cpp 复制代码
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

cpp 复制代码
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

相关推荐
白总Server21 分钟前
MySQL在大数据场景应用
大数据·开发语言·数据库·后端·mysql·golang·php
Lingbug1 小时前
.Net日志组件之NLog的使用和配置
后端·c#·.net·.netcore
计算机学姐2 小时前
基于SpringBoot+Vue的篮球馆会员信息管理系统
java·vue.js·spring boot·后端·mysql·spring·mybatis
好兄弟给我起把狙2 小时前
[Golang] Select
开发语言·后端·golang
程序员大金2 小时前
基于SpringBoot+Vue+MySQL的智能物流管理系统
java·javascript·vue.js·spring boot·后端·mysql·mybatis
许野平2 小时前
Rust: Warp RESTful API 如何得到客户端IP?
tcp/ip·rust·restful·ip地址
ac-er88883 小时前
在Flask中处理后台任务
后端·python·flask
ac-er88883 小时前
Flask中的钩子函数
后端·python·flask
customer084 小时前
【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
Flying_Fish_roe4 小时前
Spring Boot-版本兼容性问题
java·spring boot·后端