东方财富 c语言函数,C语言的歧义

本文来自:/?p=830

语言是人与人相互沟通的途径,而计算机语言则是人和计算机沟通的途径。就算是任何再完美的自然语言都会有歧义,但是又是什么让人和计算计算机间产生了歧义呢?

下面这篇文章来自Gowri Kumar的Puzzle C一文。我做了一些整理,挑选了其中的一些问题,并在之后配上相应的答案(这些答案是我加的,如果需要原版的答案可以直接和本文作者Gowri Kumar联系,作者的联系方式可以从这里得到)。

puzzle 1

此段程序的作者希望输出数组中的所有元素,但是他却没有得到他想要的结果,是什么让程序员和计算机产生歧义?

02.#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) 03.int array[] = {23,34,12,17,204,99,16}; 04.int main() 05.{ 06.int d; 07.08.for(d=-1;d = (TOTAL_ELEMENTS-2);d ) 09.printf( %d ,array[d 1]); 10.11.return 0;

解答:

运行上面的程序,结果是什么都没有输出,导致这个结果的原因是sizeof的返回值是一个unsinged int,为此在比较int d 和TOTAL_ELEMENTS两个值都被转换成了unsigned int来进行比较,这样就导致-1被转换成一个非常大的值,以至于for循环不满足条件。因此,如果程序员不能理解sizeof操作符返回的是一个unsigned int的话,就会产生类似如上的人机歧义。puzzle 2

看上去非常完美的程序,是什么导致了编程程序不通过?

解答:

程序员要以计算机的语言进行思考,不上上面那段程序导致的结果不止是歧义这么简单,而直接的结果是,导致计算机 听不懂 你在说什么。导致计算机听不懂的原因是HP-UX中的 -"是减号?还是其他什么?puzzle 3

下面这段程序会输出什么,为什么?

解答:

1到14?不对,结果是1,因为continue的含义是不执行循环体之后语义,而直接到循环点。明显while(false)不属于循环体。导致这段程序的歧义就是:程序员没有完全理解计算机语言中continue的含义。puzzle 4

下面这段程序的输出结果是:

当然,你首先要了解##和#的用法,如果不懂的话,本题你可以直接跳过。

解答:

看到这段程序你可能会认为,这两个printf输出的同一个结果,可是答案却非如此,本题的输出是12和f(1,2),为什么会这样呢?因为这是宏,宏的解开不象函数执行,由里带外。puzzle 5

下面这段程序的输出是什么

#include stdio.h

int main()

{

int a=10;

switch(a)

{

case 1 :

printf( _disibledevent="http://blog.eastmoney.com/qbi74428qy/blog_151468467.html" target="_blank">http://blog.eastmoney.com/qbi74428qy/blog_151468467.htmlhttp://blog.eastmoney.com/qdx15378qu/blog_151468466.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值