12个滑稽的C语言面试问答——《12个有趣的C语言问答》评析(3)

前文链接:http://www.cnblogs.com/pmer/p/3322429.html

5,atexit with _exit

Q:在以下代码,atexit()方法并没有被调用,你知道为什么吗?

#include<stdio.h>
 
void func(void)
{
    printf("\n Cleanup function called \n");
    return;
}
 
int main(void)
{
    int i = 0;
 
    atexit(func);
 
    for(;i<0xffffff;i++);
 
    _exit(0);
}

A:这是因为使用了 _exit() 方法。此方法并没有调用清除数据相关的方法,比如 atexit()等。

Answer: This behavior is due to the use of function _exit(). This function does not call the clean-up functions like atexit() etc. If atexit() is required to be called then exit() or ‘return’ should be used.

评:

  这个Answer没什么问题。不过_exit()函数只是个别编译器的方言。C99中同样功能的函数是_Exit()。

  这里稍微解释一下atexit()。这个函数的功能是注册在程序结束时自动调用的函数。一旦程序调用exit()函数或main()通过renturn语句结束程序,通过atexit()注册的函数将得到调用执行。可以注册多个函数,最后调用的次序与注册次序是相反的。

  与_Exit()类似,调用abort()函数结束程序时,atexit()注册的函数同样也不会被调用执行。

6,void* 与 C 结构体

Q:能否设计一个方法接受任意类型的参数然后返回整数?同时是否有办法传递多个这样的参数?

A:一个能接受任意类型参数的方法像下面这个样子:

int func(void *ptr)

如果需要传递多个参数,那么我们可以传递一个包含这些参数的结构体

Answer: A function that can accept any type of argument looks like :
  int func(void *ptr)
if more than one argument needs to be passed to this function then this function could be called with a structure object where-in the structure members can be populated with the arguments that need to be passed.

评:

  接受“任意类型的参数”( 原文:Can you design a function that can accept any type of argument and returns an integer?  )的函数在C语言中是不存在的,这个问题的要求本身就很扯蛋。

  从后面的Answer看,问题的意思是任意种类的指针类型,但是从实用的角度来说,int func(void *ptr)这种函数基本没有任何意义,几乎不可能存在。因为函数仅仅接受一个void *类型的参数,根本就不可能对这个参数做什么有实际意义的操作(唯一有意义的例外是free() )。理由很简单,void *类型的指针只有赋值和类型转换这两种运算。

  正因为如此,所以凡是接受void *类型参数的函数,通常必定还要有一个size_t类型的参数。例如

void *memset(void *s, int c, size_t n);

  至于“如果需要传递多个参数,那么我们可以传递一个包含这些参数的结构体”,则更是一种异想天开的天方夜谭,没有半点可操作性。

7,* 与 ++ 操作符

Q:以下代码将输出什么?为什么?

#include<stdio.h>
 
int main(void)
{
    char *ptr = "Linux";
    printf("\n [%c] \n",*ptr++);
    printf("\n [%c] \n",*ptr);
 
    return 0;
}

A:以上的输出将是:

  因为++与 * 的优先级一样,所以 *ptr++ 将会从右向左操作。按照这个逻辑,ptr++ 会先执行然后执行*ptr。所以第一个结果是’L'。也因为 ++ 被执行了,所以下一个printf() 结果是’i'。

Answer: The output of the above would be :

[L]
 
[i]

Since the priority of both ‘++’ and ‘*’ are same so processing of ‘*ptr++’ takes place from right to left. Going by this logic, ptr++ is evaluated first and then *ptr. So both these operations result in ‘L’. Now since a post fix ‘++’ was applied on ptr so the next printf() would print ‘i’.

评:

  中译本这回漏掉了原文中的一些东西——程序的输出。

  Answer中解释说 ++ 和 * 的优先级一样是错误的。后缀++运算符的优先级高于一元*运算符。

  “ptr++ 会先执行然后执行*ptr”这个解释同样荒唐,无法自圆其说。因为既然先执行ptr++,那么ptr应该指向了L后面的i,然后执行*ptr应该得到i,但实际上得到的却是L。显然,这个推理过程中有毛病,作者自己都没搞清楚究竟是怎么回事。这个推理过程中的毛病就是所谓的“先执行”、“后执行”的说法。

(未完待续)

 
 
 
标签: C语言面试

C语言面试问答(3)的更多相关文章

  1. C语言面试问答5

    12个滑稽的C语言面试问答——<12个有趣的C语言问答>评析(5) 前文链接:http://www.cnblogs.com/pmer/archive/2013/09/17/3327262. ...

  2. 12个滑稽的C语言面试问答——《12个有趣的C语言问答》评析(5)

    前文链接:http://www.cnblogs.com/pmer/archive/2013/09/17/3327262.html A,局部变量的返回地址 Q:下面的代码有问题吗?如果有,如何修改? # ...

  3. .NET面试问答集锦

    程序员级别鉴定书(.NET面试问答集锦) 提供避免元素命名冲突的方法 DOM适合的使用场景是什么?是否有尺寸限制? DOM是一种与浏览器,平台,语言无关的接口,使你可以访问页面其他的标准组件. DOM ...

  4. .net面试问答

    转载自:https://www.cnblogs.com/dingfangbo/p/5768991.html .net面试问答(大汇总)   原文://http://blog.csdn.net/weny ...

  5. 电话面试问答Top 50 --[伯乐在线]

    今年是2015年,在过去几年中,电面(电话面试)是筛选程序员职位候选人的最流行的方式.它让雇佣双方很容易互相了解对方,候选人不需要去未来雇主的所在地,面试官也不用做额外的安排.这是我介绍程序员面试问题 ...

  6. 常见的25个python面试问答

    常见的25个python面试问答 说到好用简洁的大数据技术,除了Hadoop.R等等,Python也是其中熠熠生辉的一员,因而广受企业和商家的青睐.求职季,不少应聘者在面试相关职业时都被要求掌握Pyt ...

  7. 面试宝典之基本的C#面试问答

    下文是100个基本的C#面试问答清单.这些面试问题简单.直接了当,涵盖了C#最基本的概念,大部分和面向对象的概念相关.所以如果你在准备C#面试,我建议你必须掌握这100个基本的C#面试问答来复习你的C ...

  8. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  9. 10个经典的C语言面试基础算法及代码

    10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...

随机推荐

  1. 浅谈JavaScript中的柯里化函数

    首先,不可避免的要引经据典啦,什么是柯里化函数呢(from baidu): 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返 ...

  2. opengl微开发之1-从零開始

    对OpenGL有一点了解之后,如今開始真正编写代码. 今天的内容: 使用FreeGLUT创建OpenGL的上下文环境 初始化GLEW 创建一个OpenGL的的模板范例 第一步: 一个OpenGL的上下 ...

  3. [CLR via C#]1.2 将托管模块合并成程序集

    原文:[CLR via C#]1.2 将托管模块合并成程序集 1.CLR是不和托管模块一起工作的,CLR是和程序集一起工作的. 2. 程序集是一个或多个托管模块/资源文件的逻辑性分组.   3. 程序 ...

  4. RabbitMQ基本管理(上)

    1.1.2  显示RabbitMQ进程 查看RabbitMQ进程信息,输入以下命令: <span style="font-size:18px;"><strong& ...

  5. 【UVA】10285-Longest Run on a Snowboard(动态规划)

    这是一个简单的问题.你并不需要打印路径. 状态方程dp[i][j] = max(dp[i-1][j],dp[i][j-1],dp[i+1][j],dp[i][j+1]); 14003395 10285 ...

  6. Spring之SpringMVC前端控制器DispatcherServlet(源码)分析

    1.DispatcherServlet作用说明 DispatcherServlet提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得 ...

  7. 依据道路的shape获得high_cross和low_cross

    如图所看到的:怎样依据提供的道路的shape file获得该路的high cross和low cross 所谓的high cross就是图中的king st这条路,low cross是Gravers ...

  8. 【剑指offer】的功率值

    标题叙述性说明: 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数.同一时候不须要考虑大数问题. 分析描写叙述: ...

  9. [翻译]初识SQL Server 2005 Reporting Services Part 1

    原文:[翻译]初识SQL Server 2005 Reporting Services Part 1 构建和部署基本报表 如果曾经存在一项工作使得“真正的”开发者给他的上司泡蘑菇,那就是构建报表.毕竟 ...

  10. nginx配置文件中的location详解

    location 语法:location [=|~|~*|^~] /uri/ { … } 默认:否 上下文:server 这个指令随URL不同而接受不同的结构.你可以配置使用常规字符串和正则表达式.如 ...