AI(chatGPT)有时也故意误导人类,不能全信

问题内容

c语言中==和&&优先级哪个高?

正确答案是什么?猜一猜chatGPT会给出什么答案?

类似1+1等于2这么简单的问题本身无意思,大佬们根本不会写出这样的代码。但这至少证明chatgpt有时是错的,不能太相信。当然我还是挺喜欢用它的,只是后续他给出的结果多怀疑一下,留点儿心罢了。

#include <iostream>using namespace std;int main()
{cout<<"Hello World\n";int a = 5,b = 1;if(a==5 && (b==1) ){cout << "true";}else{cout << "false";}return 0;
}

当然类似这种容易模糊记混淆的加括号最保险。但有时候若习惯不好就搞出来bug了,比如信了这个gpt-3.5-AI,还故意生成错误答案。

问了两遍,都确信的给出以下答案,简直混淆视听,误导人类 !

一般的问题如10只鸡和10条腿一共几条腿,如果它回答错还能理解,很容易分辨。毕竟这训练出来的AI语言能力还行,但推理能力还不如小学生。但类似这种c语言基础知识,给出错误答案,着实容易误导人。即便你百度搜索下,网络上也是正确的结果占大多数吧,怀疑有时候它是故意的。

ndd的chatgpt插件回答

ndd(notepad--),一款不错的替代notepad++的记事本软件。

它上面的gpt插件,回答内容如下:

vscode的Bito回答

再换一个chatgpt插件Bito试试:

cursor神器的回答

据说cursor编程神器使用的可是最新的gpt-4,也来问问它吧,结果回答竟也是错的。

它的回答如下:

In C, the && operator has higher precedence than the == operator. This means that expressions containing both operators will be evaluated with the && operator first.

好在,我纠正了它的错误,它才意识到并解释了下,好在知错能改。

new bing的回答 

最后,试试微软的最新的new bing,看看有没有奇迹。

虽说AI只能当做参考,肯定不能全信 。但是类似这个问题,这么基础的问题都能够给出错误答案,这AI有时还真不靠谱啊。

对比了下,还是微软的new bing,给出的是正确的答案,没有让人太失望。

正确答案

==的优先级更高。

所以,编程之中一定要牢记运算符的优先级问题,不可凭感觉自以为是,以免写出错误的代码。

c语言运算符优先级从高到低的顺序依次如下:

优先级

运算符

名称或含义

使用形式

结合方向

说明

1

[]

数组下标

数组名[常量表达式]

左到右

()

圆括号

(表达式)
函数名(形参表)

.

成员选择(对象)

对象.成员名

->

成员选择(指针)

对象指针->成员名

2

-

负号运算符

-表达式

右到左

单目运算符

(类型)

强制类型转换

(数据类型)表达式

++

自增运算符

++变量名
变量名++

单目运算符

--

自减运算符

--变量名
变量名--

单目运算符

*

取值运算符

*指针变量

单目运算符

&

取地址运算符

&变量名

单目运算符

!

逻辑非运算符

!表达式

单目运算符

~

按位取反运算符

~表达式

单目运算符

sizeof

长度运算符

sizeof(表达式)

3

/

表达式 / 表达式

左到右

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式%整型表达式

双目运算符

4

+

表达式+表达式

左到右

双目运算符

-

表达式-表达式

双目运算符

5

<<

左移

变量<<表达式

左到右

双目运算符

>>

右移

变量>>表达式

双目运算符

6

>

大于

表达式>表达式

左到右

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

<

小于

表达式<表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

左到右

双目运算符

!=

不等于

表达式!= 表达式

双目运算符

8

&

按位与

表达式&表达式

左到右

双目运算符

9

^

按位异或

表达式^表达式

左到右

双目运算符

10

|

按位或

表达式|表达式

左到右

双目运算符

11

&&

逻辑与

表达式&&表达式

左到右

双目运算符

12

||

逻辑或

表达式||表达式

左到右

双目运算符

13

?:

条件运算符

表达式1? 表达式2: 表达式3

右到左

三目运算符

14

=

赋值运算符

变量=表达式

右到左

/=

除后赋值

变量/=表达式

*=

乘后赋值

变量*=表达式

%=

取模后赋值

变量%=表达式

+=

加后赋值

变量+=表达式

-=

减后赋值

变量-=表达式

<<=

左移后赋值

变量<<=表达式

>>=

右移后赋值

变量>>=表达式

&=

按位与后赋值

变量&=表达式

^=

按位异或后赋值

变量^=表达式

|=

按位或后赋值

变量|=表达式

15

,

逗号运算符

表达式,表达式,…

左到右

优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合,同一行中的运算符的优先级相同。

不同类型的运算符之间也有相应的优先级顺序。

一个表达式中既可以包括相同类型的运算符,也可以包括不同类型的运算符或者函数。当多种运算符出现在同一个表达式中时,应该先按照不同类型运算符间的优先级进行运算。

各种运算符间的优先级如下:数值运算符、字符串运算符、关系运算符、逻辑运算符。可以用括号改变优先级顺序,使得括号内的运算优先于括号外的运算。对于多重括号,总是由内到外强制表达式的某些部分优先运行。括号内的运算总是最优先计算。

引用

C语言运算符优先级和结合性一览表

C++ Shell

GDB online Debugger | Compiler - Code, Compile, Run, Debug online C, C++

本文链接:https://my.lmcjl.com/post/1820.html

展开阅读全文

4 评论

留下您的评论.