俗话说,尽信书则不如无书。换成现代的智能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 |
, |
逗号运算符 |
表达式,表达式,… |
左到右 |
优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合,同一行中的运算符的优先级相同。
不同类型的运算符之间也有相应的优先级顺序。
一个表达式中既可以包括相同类型的运算符,也可以包括不同类型的运算符或者函数。当多种运算符出现在同一个表达式中时,应该先按照不同类型运算符间的优先级进行运算。
各种运算符间的优先级如下:数值运算符、字符串运算符、关系运算符、逻辑运算符。可以用括号改变优先级顺序,使得括号内的运算优先于括号外的运算。对于多重括号,总是由内到外强制表达式的某些部分优先运行。括号内的运算总是最优先计算。
引用
GDB online Debugger | Compiler - Code, Compile, Run, Debug online C, C++