语言的歧义
赵锟
zhaokun.km (at)gmail.com
原文:http://cocre.com/?p=830
语言是人与人相互沟通的途径,而计算机语言则是人和计算机沟通的途径。就算是任何再完美的自然语言都会有歧义,但是又是什么让人和计算计算机间产生了歧义呢?
下面这篇文章来自Gowri Kumar的Puzzle C一文。我做了一些整理,挑选了其中的一些问题,并在之后配上相应的答案(这些答案是我加的,如果需要原版的答案可以直接和本文作者Gowri Kumar联系,作者的联系方式可以从这里得到)。
puzzle 1
此段程序的作者希望输出数组中的所有元素,但是他却没有得到他想要的结果,是什么让程序员和计算机产生歧义?
01.
#include<stdio.h>
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\n"
,array[d+1]);
10.
11.
return
0;
12.
}
解答:
运行上面的程序,结果是什么都没有输出,导致这个结果的原因是sizeof的返回值是一个unsinged int,为此在比较int d 和TOTAL_ELEMENTS两个值都被转换成了unsigned int来进行比较,这样就导致-1被转换成一个非常大的值,以至于for循环不满足条件。因此,如果程序员不能理解sizeof操作符返回的是一个 unsigned int的话,就会产生类似如上的人机歧义。
puzzle 2
看上去非常完美的程序,是什么导致了编程程序不通过?
01.
#include<stdio.h>
02.
03.
void
OS_Solaris_print()
04.
{
05.
printf
(
"Solaris - Sun Microsystems\n"
);
06.
}
07.
08.
void
OS_Windows_print()
09.
{
10.
printf
(
"Windows - Microsoft\n"
);
11.
12.
}
13.
void
OS_HP-UX_print()
14.
{
15.
printf
(
"HP-UX - Hewlett Packard\n"
);
16.
}
17.
18.
int
main()
19.
{
20.
int
num;
21.
printf
(
"Enter the number (1-3):\n"
);
22.
scanf
(
"%d"
,&num);
23.
24.
switch
(num)
25.
{
26.
case
1:
27.
OS_Solaris_print();
28.
break
;
29.
case
2:
30.
OS_Windows_print();
31.
break
;
32.
case
3:
33.
OS_HP-UX_print();
34.
break
;
35.
default
:
36.
printf
(
"Hmm! only 1-3 :-)\n"
);
37.
break
;
38.
}
39.
40.
return
0;
41.
}
解答:
程序员要以计算机的语言进行思考,不上上面那段程序导致的结果不止是歧义这么简单,而直接的结果是,导致计算机”听不懂”你在说什么。导致计算机听不懂的原因是HP-UX中的’-'是减号?还是其他什么?
puzzle 3
下面这段程序会输出什么,为什么?
01.
enum
{
false
,
true
};
02.
03.
int
main()
04.
{
05.
int
i=1;
06.
07.
do
08.
{
09.
printf
(
"%d\n"
,i);
10.
i++;
11.
if
(i < 15)
12.
continue
;
13.
}
while
(
false
);
14.
15.
return
0;
16.
}
解答:
1到14?不对,结果是1,因为continue的含义是不执行循环体之后语义,而直接到循环点。明显while(false)不属于循环体。导致这段程序的歧义就是:程序员没有完全理解计算机语言中continue的含义。
puzzle 4
下面这段程序的输出结果是:
01.
#include <stdio.h>
02.
#define f(a,b) a##b
03.
#define g(a) #a
04.
#define h(a) g(a)
05.
06.
int
main()
07.
{
08.
printf
(
"%s\n"
,h(f(1,2)));
09.
printf
(
"%s\n"
,g(f(1,2)));
10.
return
0;
11.
}
当然,你首先要了解##和#的用法,如果不懂的话,本题你可以直接跳过。
解答:
看到这段程序你可能会认为,这两个printf输出的同一个结果,可是答案却非如此,本题的输出是12和f(1,2),为什么会这样呢?因为这是宏,宏的解开不象函数执行,由里带外。
puzzle 5
下面这段程序的输出是什么
#include <stdio.h>
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
下面这段程序的输出什么?
01.
#include <stdio.h>
02.
03.
int
main()
04.
{
05.
float
f=0.0f;
06.
int
i;
07.
08.
for
(i=0;i<10;i++)
09.
f = f + 0.1f;
10.
11.
if
(f == 1.0f)
12.
printf
(
"f is 1.0 \n"
);
13.
else
14.
printf
(
"f is NOT 1.0\n"
);
15.
16.
return
0;
17.
}
解答:
你是否似曾相识?不错这个问题在酷壳之前的博文《你能做对下面这些JavaScript的题吗?》中曾今提到过,不要让两个浮点数相比较。所以本题的答案是”f is NOT 1.0″,如果你真想比较两个浮点数时,你应该按一定精度来比较,比如你一定要在本题中做比较那么你应该这么做if( (f - 1.0f)<0.1 )
puzzle 7
下面两个函数是否具有相同的原型?
1.
int
foobar(
void
);
2.
int
foobar();
下面这两段程序将会帮你找到上题的答案
程序1
01.
#include <stdio.h>
02.
void
foobar1(
void
)
03.
{
04.
printf
(
"In foobar1\n"
);
05.
}
06.
07.
void
foobar2()
08.
{
09.
printf
(
"In foobar2\n"
);
10.
}
11.
12.
int
main()
13.
{
14.
char
ch =
'a'
;
15.
16.
foobar1();
17.
foobar2(33, ch);
18.
19.
return
0;
20.
}
程序2
01.
#include <stdio.h>
02.
void
foobar1(
void
)
03.
{
04.
printf
(
"In foobar1\n"
);
05.
}
06.
07.
void
foobar2()
08.
{
09.
printf
(
"In foobar2\n"
);
10.
}
11.
12.
int
main()
13.
{
14.
char
ch =
'a'
;
15.
16.
foobar1(33,ch);
17.
foobar2();
18.
19.
return
0;
20.
}
解答
程序片段一,没有问题,程序片段二编译报错,这两个程序告诉我们,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语言的题目,不禁让我想起了巴别塔,计算机语言作为如此严谨的语言都有可能带来如此多的歧义,更何况自然语言,更何况相互不通的自然语言。要杜绝歧义,我们就必须清晰的了解计算机语言每一个指令的语义。就如同人类,人类要和平就要相互了解各自的文化。愿世界上人们清晰了解别人的语言的语义,愿世界不再因为文化的不同而战争,原世界和平。
(转载时请注明作者和出处。未经许可,请勿用于商业用途)
分享到:
相关推荐
《探讨GPT-4在处理语言歧义中的局限性》 自然语言处理领域的进步日新月异,其中,GPT-4作为一款先进的语言模型,备受关注。然而,最新的研究揭示了一个令人深思的问题——GPT-4在理解语言歧义上存在显著的局限性。...
在处理对话中的语言歧义和多义词时,ChatGPT运用了一系列智能策略,使其能够在一定程度上模仿人类的语言理解能力。 首先,ChatGPT的核心能力在于利用上下文理解。在对话过程中,模型会跟踪和记忆之前的对话内容,...
最新研究,GPT-4暴露了缺点!无法完全理解语言歧义!
ChatGPT技术的使用教程、使用方法、使用技巧、使用注意事项、使用中常见问题
ChatGPT技术的使用教程、使用方法、使用技巧、使用注意事项、使用中常见问题
ChatGPT技术的使用教程、使用方法、使用技巧、使用注意事项、使用中常见问题
【自然语言处理中的歧义概念】 自然语言处理(NLP)是计算机科学的一个分支,它致力于理解和生成人类使用的自然语言。在NLP中,歧义是核心挑战之一,因为它涉及到如何准确地解析和理解文本。歧义是由于语言的复杂性...
《ChatGPT中的语言歧义分析》 自然语言处理(NLP)领域一直面临的主要挑战之一就是语言歧义。近年来,BERT、T5等现代Transformer架构以及最近的InstructGPT在许多NLP领域取得了显著的进步,但仍有大量工作需要完成...
在NLP中,消除语言歧义是一项关键任务。中文文本的多义性和歧义性使得理解和生成自然语言具有挑战性。同一个文本在不同情境下可能有不同的解释,消解这些歧义需要大量知识和推理。因此,建立一个能够有效处理自然...
这一体系有助于消除因语言歧义导致的误解,提高团队协作效率。企业工作语言体系的构建主要包括以下几个步骤: 1. **识别核心术语**:确定企业业务的关键概念和专有名词,确保所有员工对这些词汇有共识性的理解。 2....
近80%的企业内容是非结构化的。它包括快速增长的人为内容,包括备忘录,电子邮件...最先进的语言歧义处理 集成的机器学习功能与许多预先打包的型号一起开箱即用 能够支持广泛的企业用例 可扩展的机器学习和知识图技术
34. **消除歧义的方法**:可以通过上下文、标点符号、重音、词语排列顺序、明确词义等方式消除语言歧义,例如使用限定词、具体化表述或避免平行结构的混淆。 以上内容涵盖了语言学概论中的一些核心概念和理论,涉及...
6. 语言歧义的避免:在表达中,要防止产生歧义,如句子"A项中的‘他’既可理解为嘉宾,又可理解为别的人",说明在写作时应明确指代对象,避免读者产生混淆。 综上所述,这份资料着重于提升学生的语言运用能力,强调...
* 语言歧义:英语考研真题中存在许多语言歧义,例如同义词、反义词等,了解这些语言歧义可以帮助考生避免失分。 * 词汇 trick:英语考研真题中存在许多词汇 trick,例如多义词、同义词等,了解这些词汇 trick 可以...
- **知识辅助网络**:为解决类别不均匀和标注不完整的数据集问题,论文提出了引入知识辅助网络来增加网络的类别多样性,并通过上下文信息动态调整学习率,以减少语言歧义并提高匹配准确性。 - **开词集的重要性**...
【歧义广告语言的传播效果分析】这篇汉语言文学毕业论文主要探讨了广告语言中的一种特殊现象——歧义,以及这种现象在广告传播中的影响和效果。广告语言,作为商家与消费者沟通的重要桥梁,其独特性和艺术性在于能够...
对抗学习是一种训练模型的方法,它通过引入对手策略来提高模型的鲁棒性和泛化能力。...这种方法对于处理具有语言歧义性的文本数据特别有用,有助于提升未来NLP系统在理解和提取事件信息方面的准确性。
在高中语文学习中,理解和避免歧义是提升语言表达准确性的关键。歧义分为多种类型,如语音歧义、语汇歧义、停顿歧义和语法歧义。 2. **语音歧义**:由发音的重音、轻声等变化导致的理解差异。例如,“一个月就生产...
通过上下文建模、利用预训练模型、引入语义解析和知识库,以及灵活运用对话策略,ChatGPT可以更有效地应对语言歧义和复杂语义,提供更加精确和人性化的对话体验。这对于提升聊天机器人的实际应用效果和用户体验有着...
三是语言歧义问题,如“他喜欢苹果”,ChatGPT需要根据上下文判断这里的“苹果”是指水果还是苹果公司,这需要更精细的语境理解能力。 总结来说,ChatGPT技术在知识图谱和语义关系处理上有着显著的进步,能提供更...