linux 歧义的文件名,语言的歧义_Linux编程_Linux公社-Linux系统门户网站

news/2024/5/9 13:22:07/文章来源:https://blog.csdn.net/weixin_42641741/article/details/116888407

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

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

puzzle 1

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

#include

#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))

int array[] = {23,34,12,17,204,99,16};

int main()

{

int d;

for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)

printf("%d\n",array[d+1]);

return 0;

}

解答:

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

puzzle 2

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

#include

void OS_Solaris_print()

{

printf("Solaris - Sun Microsystems\n");

}

void OS_Windows_print()

{

printf("Windows - Microsoft\n");

}

void OS_HP-UX_print()

{

printf("HP-UX - Hewlett Packard\n");

}

int main()

{

int num;

printf("Enter the number (1-3):\n");

scanf("%d",&num);

switch(num)

{

case 1:

OS_Solaris_print();

break;

case 2:

OS_Windows_print();

break;

case 3:

OS_HP-UX_print();

break;

default:

printf("Hmm! only 1-3 :-)\n");

break;

}

return 0;

}

解答:

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

puzzle 3

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

enum {false,true};

int main()

{

int i=1;

do

{

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

i++;

if(i < 15)

continue;

}while(false);

return 0;

}

解答:

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

puzzle 4

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

#include

#define f(a,b) a##b

#define g(a) #a

#define h(a) g(a)

int main()

{

printf("%s\n", h(f(1,2)));

printf("%s\n", g(f(1,2)));

return 0;

}

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

解答:

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

puzzle 5

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

#include

int main()

{

int a=10;

switch(a)

{

case ’1′:

printf(“ONE\n”);

break;

case ’2′:

printf(“TWO\n”);

break;

defau1t:

printf(“NONE\n”);

return 0;

}

解答:

本题我故意将语法敏感插件去掉,为了就是能得到更好的效果,这道题又是什么让歧义再次发生,如果不仔细你可能永远都找不到答案,如果真到的到了那个时候,你是否会因为对default语义的怀疑,而不敢再使用default?本题的歧义点就是default,看好了是defau1t而不是default,不是关键字!为什么计算能”听懂”这样的defau1t,算然它听懂了,但它的理解却是标号”defau1t”

puzzle 6

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

#include

int main()

{

float f=0.0f;

int i;

for(i=0;i<10;i++)

f = f + 0.1f;

if(f == 1.0f)

printf("f is 1.0 \n");

else

printf("f is NOT 1.0 \n");

return 0;

}

解答:

你是否似曾相识?不错这个问题在酷壳之前的博文《你能做对下面这些JavaScript的题吗?》中曾今提到过,不要让两个浮点数相比较。所以本题的答案是”f is NOT 1.0″,如果你真想比较两个浮点数时,你应该按一定精度来比较,比如你一定要在本题中做比较那么你应该这么做if( (f – 1.0f)<0.1 )

puzzle 7

下面两个函数是否具有相同的原型?

int foobar(void);

int foobar();

下面这两段程序将会帮你找到上题的答案

程序1

#include

void foobar1(void)

{

printf("In foobar1\n");

}

void foobar2()

{

printf("In foobar2\n");

}

int main()

{

char ch = 'a';

foobar1();

foobar2(33, ch);

return 0;

}

程序2

#include "stdio.h"

void foobar1(void)

{

printf("In foobar1\n");

}

void foobar2()

{

printf("In foobar2\n");

}

int main()

{

char ch = 'a';

foobar1(33,ch);

foobar2();

return 0;

}

解答

程序片段一,没有问题,程序片段二编译报错,这两个程序告诉我们,foobar1(void)和foobar2()是有不同原型的的。我们可以在《ISO/IEC 9899》的C语言规范找到下面两段关于函数声明的描述

10.The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters

14.An identifier list declares only the identifiers of the parameters of the function. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters. The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.124)

上面两段话的意思就是:foobar1(void)是没有参数,而foobar1()等于forbar1(…)等于参数类型未知。

总结

看到这些C语言的题目,不禁让我想起了巴别塔,计算机语言作为如此严谨的语言都有可能带来如此多的歧义,更何况自然语言,更何况相互不通的自然语言。要杜绝歧义,我们就必须清晰的了解计算机语言每一个指令的语义。就如同人类,人类要和平就要相互了解各自的文化。愿世界上人们清晰了解别人的语言的语义,愿世界不再因为文化的不同而战争,原世界和平。

0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_812962.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型网站架构 - LAMP

一 网站大访问量 1. 负载均衡&#xff1a;大的访问量平均分流到多台PC机 Linux LVS负载均衡 2. 冗余技术&#xff1a;服务器集群&#xff0c;一台服务器宕机&#xff0c;另一台服务器会被激活&#xff08;防止单点故障&#xff09; 二 网站大数据存储 1. Mysql数据库集群&am…

大流量的网站如何优化

1.CSS,JS 打包压缩,cdn 2.减少http请求&#xff0c;使用页面静态化 3.优化数据库慢查询和优化代码 4.使用缓存&#xff0c;如memcache,redis,使用mysql主从 5.负载均衡加机器 6.拆分应用项目&#xff0c;一个服务对应有一个项目&#xff0c;比如订单对应一个项目&#xff…

新手如何做好seo?从内部链接开始!

对于seo初学者而言&#xff0c;往往大部分时间和精力都花费在挖词和写文章上&#xff0c;2019年由于百度流量闭环的趋势明显&#xff0c;想要从搜索引擎获得流量和排名越发显得困难&#xff0c;对于不想写文章的朋友来说&#xff0c;不妨试试构建良好的 “内部链接”来尝试获得…

【seo伴侣】7种简单的seo技术

要控制搜索排名&#xff0c;需要不断适应和即兴发挥SEO技术。在这篇文章中&#xff0c;查看最有效的SEO技术&#xff0c;这些技术易于实现并获得理想的结果。 SEO最简单的7种技术 1.写文章 内容是在线推广网站的最佳方式之一&#xff0c;通过为网站撰写内容&#xff0c;可以…

seo营销怎么做?seo是仅关于流量还是更多?

每个人都在谈论搜索引擎优化&#xff0c;但它真正的含义是什么&#xff1f;所有的搜索引擎优化营销人员都是平等的吗&#xff1f;他们是否都有相同的策略&#xff0c;但在执行上却有不同&#xff1f; 从某种程度上说&#xff0c;SEO在大多数行业中都是独一无二的。整个行业都建…

大型网站seo怎么做?大型网站优化需注意的6个方面

任何一个网站&#xff0c;无论规模大小&#xff0c;都要建立在seo基础上。对于大型网站而言&#xff0c;良好的底层优化可以增加页面索引量和有机可见性。 “大型网站”的定义无疑会因个人观点的不同而有所不同&#xff0c;但就本文的目的而言&#xff0c;我指的是拥有数十万个…

网站性能优化:懒加载和预加载

一、懒加载 1.什么是懒加载 懒加载也叫延迟加载&#xff0c;指的是在长网页中延迟加载图像&#xff0c;是一种很好优化网页性能的方式。用户滚动到它们之前&#xff0c;可视区域外的图像不会加载。这与图像预加载相反&#xff0c;在长网页上使用延迟加载将使网页加载更快。在某…

linux 网站 访问日志在哪里看,怎样查看网站linux服务器日志

怎样查看网站linux服务器日志[2020-09-08 08:32:43] 简介:linux下查看php错误日志的方法&#xff1a;1、打开php.ini配置文件&#xff0c;开启错误日志&#xff1b;2、重启web服务器&#xff1b;3、查看错误日志存放位置&#xff1b;4、执行【tail -f 50 /var/php_errors.log】…

网站发送Mail功能类

usingSystem;usingSystem.Web.Mail;usingSystem.Configuration;usingSystem.Net.Mail;/**//// <summary>/// 网站发送Mail功能类/// </summary>publicclassMailHelper{ private static string sendUserName ConfigurationManager.AppSettings["sendUserNa…

[导入] 网站架构之主页设计

摘要: 网站架构之主页设计&#xff0d;用户体验良好的网站其主页需要具备的十二个使命思域最近在给编辑部培训的时候发现一个问题&#xff0c;就是他们在设计专题或者页面的时候自我意识太强&#xff0c;缺少页面设计的基本思维&#xff0c;想怎么设计就怎么设计&#xff0c;有…

如何在VS 2005 SP1中使用VS的web服务器运行一个相对于根目录“/”的网站

在VS2008里点“调试”后。站点会根据现有站点的名称产生一个虚拟目录名&#xff0c;这给调试带来很大的影响。特别是绝对路径的站点图片受到影响。 解决方法一来源&#xff1a;http://msdn.microsoft.com/zh-cn/library/ms178109.aspx 为 ASP.NET Development Server 指定端口 …

海洋工作室——网站建设专家:How to check the SQL statement execute time on SQL Server ?...

Check this,setstatisticsprofile onsetstatisticsio onsetstatisticstime ongo<Your SQL Statement goes here>gosetstatisticsprofile offsetstatisticsio offsetstatisticstime off转载于:https://www.cnblogs.com/OceanChen/archive/2009/10/12/1581791.html

获取 HTML5 网页设计灵感的10个网站推荐

这篇文章向大家推荐10个收集 HTML5 网页作品的网站&#xff0c;让大家感受一下 HTML5 的魅力。作为下一代网页标准&#xff0c;HTML5 增加了很多新标签以及新特性&#xff0c;正引领网页技术革命。希望这些优秀的 HTML5 网页案例能带给大家制作 HTML5 网页的灵感。 HTML5 Galle…

27个最佳的矢量素材免费下载网站推荐

在工作中&#xff0c;设计师经常需要到网上搜索免费资源以更快更好的完成设计项目。网上有很多的矢量素材下载网站&#xff0c;下面就为大家收集了27个资源非常丰富的免费矢量素材下载网站&#xff0c;希望你会喜欢这个清单。 1. Free Vectors Daily 2. Blood Sweet Vector 3. …

中冠百年|中冠百年理财网站手机理财

现今&#xff0c;中国是人均储蓄率最高的国家&#xff0c;已超3万。比起储蓄&#xff0c;个人网上理财在国内并不多见。因为很多都觉得个人网上理财是有钱人的事&#xff0c;穷人只要进行储蓄就要可以了。 中冠百年是一家为用户提供多元化投资等交易服务的理财公司&#xff0c…

仿牌网站服务器,主机侦探:还在为选择仿牌服务器发愁吗?

外贸仿牌最近比较火&#xff0c;SEO也开始盯上了这个商机&#xff0c;对于现在这样一个环境来说是非常容易的。如果换作是以前&#xff0c;大多数人连仿牌这个字眼提都不敢提&#xff0c;而今&#xff0c;不仅老板做仿牌&#xff0c;现在就连他的下手也开始学会做仿牌了!相对于…

服务器目标文件夹访问被拒绝,win10系统访问文件夹被拒绝怎么办_网站服务器运行维护...

linux 无法启动mysql怎么办_网站服务器运行维护linux无法启动mysql的解决办法&#xff1a;首先直接进入“/etc/my.cnf”&#xff1b;然后重启mysql&#xff1b;最后执行命令“update user set passwordpassword("") where user"root";”即可。右键点击要访…

WordPress快速建站

作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei 欢迎转载&#xff0c;也请保留这段声明。谢谢&#xff01; 这篇文章将介绍如何使用WordPress建立一个博客、网站和论坛。WordPress是基于PHP的博客架设工具。它提供了一套开源的PHP代码以方便用户在支持PH…

SEO搜索引擎优化:为什么要做SEO,为企业能带来什么价值(好处)?

SEO搜索引擎优化 SEO既Search Engine Optimization&#xff0c;翻译为搜索引擎优化&#xff0c;是一种利用技术手段提升网站在搜索引擎之中的排名的方式&#xff0c;让搜索引擎更为信任网站&#xff0c;通过排在搜索引擎的前页从而获得更多的流量。 SEO按技术手段一般分为2种&…