牛客错题整理——C语言(实时更新)

1.以下程序的运行结果是()

c 复制代码
#include <stdio.h> 
int main() { 
    int sum, pad,pAd; 
    sum = pad = 5; 
    pAd = ++sum, pAd++, ++pad; 
    printf("%d\n",pAd); 
}

答案为7

由于赋值运算符的优先级高于逗号表达式,因此pAd = ++sum, pAd++, ++pad;等价于(pAd = ++sum), pAd++, ++pad; sum 先自增然后赋值给 pAd,pAd 为 6,然后 pAd 自增变为 7。逗号表达式的结果为最后一个表达式的值,因此正确答案为 7。

2.哪一句会出错?

c 复制代码
char* s="AAA"; //1
printf("%s",s); //2
s[0]='B'; //3
printf("%s",s); //4

第3句

初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。S[0]只可读,不可写

3.对于如下C语言函数:fun(5)的结果为()

c 复制代码
int fun (int n) {
    int x = 1, k;
    if (n == 1) return x;
    for(k = 1;  k < n;  ++k)
        x = x + fun(k) * fun(n - k);
    return x;
}

答案为51

4.以下程序的输出结果为

c 复制代码
#include <stdio.h>
int func(int x, int y) { return (x + y); }
 
int main() {
    int a = 1, b = 2, c = 3, d = 4, e = 5;
    printf("%d\n", func((a + b, b + c, c + a), (d, e)));
    return 0;
}

答案为9

逗号表达式是一组由逗号分隔的表达式,这些表达式是从左向右计算。逗号表达式的结果是其最后边表达式的值,如果最后边的操作数是左值,则逗号表达式的值也是左值。此类表达式通常用于for循环。

5.若有int w=1, x=2, y=3, z=4;则条件表达w < x ? w : y < z ? y : z的值是3.

答案为 错误

因为条件运算符的结合方向是从右往左的。所以上述表达式的值应当先计算后面那个条件运算符:?的值,即w<x?w:(y<z?y:z)。因此执行顺序为:因为y小于z为真,因此 w<x?w:y,因为w小于x为真,因此表达式的值为w。

6.下列代码运行出错,可能会是哪一行引起的?

c 复制代码
void getMemory(char *p) {
    p = (char *)malloc(100); // 1
}
 
int main(int argc, char const *argv[]) {
    char *str = NULL;
    getMemory(str);
    strcpy(str, "hello wrold"); // 2
    printf("%s\n", str);        // 3
    free(str);                  // 4
}

第2句

1)调用getMemory(str)后,str并未产生变化,依然是NULL(由于str是按值传递的)。只有形参p指向了一块新申请的空间。

2)程序运行到strcpy( str, "hello world" );处将产生错误

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

c 复制代码
int main() {
    int s, i;
    for(s = 0, i = 1; i < 3; i++, s += i);
    printf("%d\n", s);
}

答案为5

逗号运算符是由多个表达式构成的,而不是整体看成一个表达式,即i++是一个表达式,s += i也是一个表达式,所以在执行s += i之前,i已经完成了一次自增。

(1)如果for后面没有分号,printf这句话就是for里面的语句。就会先执行printf再执行转化条件。

则先执行循环初试条件s=0,i=1,判断1<3,输出0,执行转化条件i=2,s=2。此时回到判断2<3,输出2。i=3,s=5。再判断3<3为0,跳出循环。

(2)现在题目在for后有分号,则for里面是空语句,先s=0,i=1,控制条件1<3结果为1,执行第二个分号后的句子,因为i++后面有逗号,所以i已经加了1,s加的是经过+1后的i,i=2,s=2。第二次循环2<3成立,i=3,s=2+3=5。第三次3<3判断结果为0,循环结束。但因为第二次循环的转化条件已经执行了。所有输出的是5。

8.对于下面代码段y的值为( )

c 复制代码
int x = 3, y = 3;
int t = ++x || ++y;

答案为3

有两个坑,第一,求的是y而不是t 第二,或运算里,左侧是1右边就不执行,与运算类似。

当解析器遇到了||时,只要前面的++x为真,后面的语句就不执行了。

9.写出下列程序在X86上的运行结果

c 复制代码
struct mybitfields
{
    unsigned short a : 4;
    unsigned short b : 5;
    unsigned short c : 7;
} test
 
void main(void)
{
    int i;
    test.a = 2;
    test.b = 3;
    test.c = 0;
 
    i = *((short *)&test);
    printf("%d\n", i);
}

答案为50

由栈的基本知识(高到低),栈上分配的空间顺序是:c,b,a

定义结构体里面用到的冒号的含义相当于分配几位空间,也即在定义结构体的时候,分配的成员a 4位的空间, b 5位,c 7位,一共是16位,正好两个字节。示意:

test.a 0 0 1 0

test.b 0 0 0 1 1

test.c 0 0 0 0 0 0 0

所以全部总和起来:0000 0000 0011 0010

在执行i=*((short *)&test); 时,取从地址&test开始两个字节(short占两个字节)的内容转化为short型数据,即为0x0032,再转为int型为0x00000032,即50

10.在Windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为()?

答案为1

类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址。同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。所以,空类的sizeof为1,而不是0.

多重继承的空类的大小也是1.

11.函数的形式参数隐含的存储类型说明是()

答案为auto

函数的隐含储存类型是extern,函数的形参或变量的储存类型为auto

12.若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是()

答案为:函数调用可以作为一个函数的形参

返回值存在寄存器中,没有地址,不能作为形参,但可以作为实参。

13.在头文件及上下文均正常的情况下,下列代码的运行结果是()

c 复制代码
int a[] = {1, 2, 3, 4};
int *b = a;
*b += 2;
*(b + 2) = 2;
b++;
printf("%d,%d\n", *b, *(b + 2));

答案为2,4

从第一步开始

*b+=2;// *b=b+2;
是将
b指向地址的值加了2,就是a[0]=3

*(b+2)=2;

等价a[2]=2。

数组变成a[4]={3,2,2,4}

b++;

b指向a[1];

当b++时,指针指向的第二个元素的地址,b=2,b+2后指针指向第四个元素,(b+2)=4;

14.以下叙述中不正确的是()

C程序中的#include和#define均不是C语句(这句正确)

在C程序中,赋值运算符的优先级最低(这句错误)

答案为:c语言中,逗号优先级最低。 用分号;结尾的才看成是C语句

一共有十五个优先级:

1 () [] . ->

2 ! ~ -(负号) ++ -- &(取变量地址)* (type)(强制类型) sizeof

3 * / %

4 + -

5 >> <<

6 > >= < <=

7 == !=

8 &

9 ^

10 |

11 &&

12 ||

13 ?:

14 = += -= = /= %= |= ^= &= >>= <<=
15 ,
括号成员第一; //括号运算符<> 成员运算符. ->
全体单目第二; //所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算
、&

乘除余三,加减四; //这个"余"是指取余运算即%

移位五,关系六; //移位运算符:<< >> ,关系:> < >= <= 等

等于(与)不等排第七; //即== 和!=

位与异或和位或,"三分天下"***十; //这几个都是位运算: 位与(&)异或(^)位或(|)

逻辑或跟与,十二和十一; //逻辑运算符:|| 和 &&,注意顺序:优先级(||) 低于 优先级(&&)

条件高于赋值, //三目运算符优先级排到13 位只比赋值运算符和","高

逗号运算级最低! //逗号运算符优先级最低

相关推荐
-一杯为品-2 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
The_Ticker13 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
风尚云网1 小时前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
繁依Fanyi1 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
烦躁的大鼻嘎1 小时前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
IU宝1 小时前
C/C++内存管理
java·c语言·c++
qq_459730031 小时前
C 语言面向对象
c语言·开发语言