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

C语言知识点考题

其实已经看了很多很好的帖子,但是只看帖子不能达到系统的认识/最新的认识,一定要看官方标准/大牛著作!

值得深究的有4

1、下面的程序并不见得会输出 hello-std-out  在Qt 5.2 Plain C Project下测试,每次都会输出hello-std-out

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    while(1)
    {
        fprintf(stderr,"hello-std-err ");
        fprintf(stdout,"hello-std-out ");
        sleep(1);
    }
    return 0;
}
参考答案stdout是块设备,stderr则不是。对于块设备,只有遇到下面几种情况下才会被输入,1)遇到回车,2)缓冲区满,3)flush被调用。

 

 2、下面的程序看起来是正常的,使用了一个逗号表达式来做初始化。

#include <stdio.h>

int main()
{
    int a = 1,2;
    printf("a : %d\n",a);
    return 0;
}
参考答案:这个程序会得到编译出错(语法出错),逗号表达式是没错。 但是在初始化和变量声明时,逗号并不是逗号表达式的意义。这点要区分,要修改上面这个程序,需要加上括号: int a = (1,2); 

 

3、下面的程序会有什么样的输出

#include <stdio.h>
int main()
{
    int i=43;
    printf("%d\n",printf("%d",printf("%d",i)));
    return 0;
}
运行结果:


参考答案:printf返回值是输出的字符个数。

 

4、下面的程序会输出什么  这个值得重点分析,涉及到计算机内部存储数据的格式,需要补补计算机系统结构了

#include <stdio.h>

int main()  
{
    float a = 12.5;
    printf("%d\n", a);
    printf("%d\n", (int)a);
    printf("%d\n", *(int *)&a);
    return 0;  
}

运行结果:


参考答案:浮点数是4个字节,12.5f 转成

二进制是:01000001010010000000000000000000,

十六进制是:0x41480000,

十进制 是:1095237632。

所以,第二和第三个输出相信大家也知道是为什么了。而对于第一个,为什么会输出0,我们需要了解一下float和double 的内存布局,如下:

float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)

double: 1位符号位(s)、11位指数(e),52位尾数(m,共64位)然后,我们还需要了解一下printf由于类型不匹配,所以,会把float直接转成double,注意,12.5的float和double的内存二进制完全不一样。别忘了在x86芯片下使用是的反字节序,高位字节和低位字位要反过来。所以

float版:0x41480000 (在内存中是:00 00 48 41)

double版:0x4029000000000000 (在内存中是:00 00 00 00 00 00 29 40)

而我们的%d要求是一个4字节的int,对于double的内存布局,我们可以看到前四个字节是00,所以输出自然是0了。 这个示例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了。

 

 5、下面,我们再来看一个交叉编译的事情,下面的两个文件可以编译通过吗?如果可以通过,结果是什么

file1.c

int arr[80];
file2.c 
extern int *arr;
int main()  
{      
    arr[1] = 100;
    printf("%d\n", arr[1]);
    return 0;  
}
Visual Studio 2010 编译错误提示:

参考答案:一个指向数组的指针,并不等于一个数组。修改:extern int arr[]。(参考:ISO C语言 6.5.4.2 节)

 

 6、是关于switch语句的,参见博文:switch的三个注意点

 

 7、请问下面的程序会有什么潜在的危险

#include <stdio.h>

int main()  
{      
    char str[80];
    printf("Enter the string:");
    scanf("%s",str);
    printf("You entered:%s\n",str);
   
    return 0;
}
记得刚学C语言时,字符串以‘\0’结束这个知识点被我忽略了很久,也因此让我有点时间遇到类似问题,痛苦的要死。
参考答案:本题很简单了。这个程序的潜在问题是,如果用户输入了超过80个长度的字符,那么就会有数组越界的问题了,你的程序很有可以及会crash了。

 

 8、请问下面的程序输出什么

#include <stdio.h>

int main()  

{

    int i;

    i = 10;

    printf("i : %d\n",i);

    printf("sizeof(i++) is: %d\n",sizeof(i++));

    printf("i : %d\n",i);

    return 0;

}
运行结果:Tested by Qt Plain C Project

参考分析:sizeof不是一个函 数,是一个操作符。求(i++)的类型的size,这是一件可以在程序运行前(编译时)完全的事情,所以,sizeof(i++)直接就被4给取代了,在运行时也就不会有了i++这个表达式。

  9、请问下面的程序的输出值是什么
#include <stdio.h>
#include <stdlib.h>

#define SIZEOF(arr) (sizeof(arr)/sizeof(arr[0]))  // 我愚昧了,以前从来没想过用这种方式计算定义时未指定
                                                  // 数组长度的数字的长度
#define PrintInt(expr) printf("%s:%d\n",#expr,(expr))  // #expr以字符形式输出expr

int main()
{
	int pot[] = {
		0001,
		0010,
		0100,
		1000
	};
	int i;
	for(i=0;i<SIZEOF(pot);i++)
	{
		PrintInt(pot[i]);
	}

	return 0;
}

运行结果:

参考答案:其实很简单,在C/C++中,以0开头的数字都是八进制的。 


10、下面的输出是什么

#include <stdio.h>

int main()  
{
	int i = 6;
	if( ((++i < 7) && ( i++/6)) || (++i <= 9));
	printf("%d\n",i);

	return 0;
}
运行结果:


参考答案:本题主要考的是&&和||的短路求值的问题。

 

11、下面的C程序是合法的吗?如果是,那么输出是什么

#include <stdio.h>

int main()  
{ 
	int a=3, b = 5;
	printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
	printf(&a["WHAT%c%c%c  %c%c  %c !\n"], 1["this"],2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);
	
	return 0;  
}
运行结果:


参考答案:下面的两种用法是相同的: "hello"[2], 2["hello"]。如果你知道:a[i] 其实就是 *(a+i)也就是 *(i+a),所以如果写成 i[a] 应该也不难理解了。 

 

12、请问下面的程序输出什么

#include <stdio.h>

int main()  
{ 
	char dummy[80];
	printf("Enter a string:\n");
	scanf("%[^r]",dummy);
	printf("%s\n",dummy);

	return 0;
}
运行结果-1:


运行结果-2:


参考答案:"%[^r]",当且仅当遇到字符r才结束输入,而且r不被指针接收。 

 

13、下面的程序试图使用“位操作”来完成“乘5”的操作

int FiveTimes(int a)  
{
    int t;
    t = a<<2 + a;  // 因为<<的优先级低于+,所以正确的是:t = (a<<2) + a; 

    return t;
}


原文:http://wenku.baidu.com/link?url=MyfwrskYY2luO69lroATY4BAN-e040K_07TGAw44yYNomfMs-Ku7oCHNgy2J8lPfXHZlGv2t59RTafNroVAVshPHqczRCFPL31wBuvv6L1K


 

相关文章:

  • 判断一个数是否为2的幂次
  • C99标准的新特性
  • C/C++标准资料
  • 如果我再次被面试,我会问的几个问题
  • Linux 常用命令记录
  • C++关键字
  • Open Broadcaster Software源码阅读笔记
  • 简单算法--迭代/递归
  • 背包九讲笔记
  • 关于类成员函数中静态变量的一点提示
  • C++ 强制类型转换若干问题
  • 面向对象设计原则
  • C++之父FAQ阅读笔记
  • 要完成的学习或考试任务
  • 类的const、static、const static成员初始化位置及其他需要注意的问题
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Apache Zeppelin在Apache Trafodion上的可视化
  • in typeof instanceof ===这些运算符有什么作用
  • Intervention/image 图片处理扩展包的安装和使用
  • Java 多线程编程之:notify 和 wait 用法
  • JAVA多线程机制解析-volatilesynchronized
  • Laravel Mix运行时关于es2015报错解决方案
  • Laravel 菜鸟晋级之路
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Otto开发初探——微服务依赖管理新利器
  • PaddlePaddle-GitHub的正确打开姿势
  • Promise面试题,控制异步流程
  • Sass 快速入门教程
  • Vim Clutch | 面向脚踏板编程……
  • Webpack 4 学习01(基础配置)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 聚簇索引和非聚簇索引
  • 每天10道Java面试题,跟我走,offer有!
  • 前端自动化解决方案
  • 提醒我喝水chrome插件开发指南
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 在Mac OS X上安装 Ruby运行环境
  • 说说我为什么看好Spring Cloud Alibaba
  • # include “ “ 和 # include < >两者的区别
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (三分钟)速览传统边缘检测算子
  • (一)Linux+Windows下安装ffmpeg
  • (一)WLAN定义和基本架构转
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)Unity3DUnity3D在android下调试
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net core使用RPC方式进行高效的HTTP服务访问
  • /etc/skel 目录作用
  • ::before和::after 常见的用法
  • @AliasFor注解