• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go

1592148.jpg

16f0ebec

为什么i!=j&&i!=k&&j!=k不能简化为i!=j!=k ?

备注:因有网友质疑我的学习速度慢,因此我日后尽量提高学习效率,希望编电脑的网友多指点。同时我不擅长编程,希望网友提出的建议或问题的解决方式尽量简单尽量通俗易懂,谢谢。





现在回归正题,为什么i!=j&&i!=k&&j!=k不能简化为i!=j!=k ?

教科书的范例如下:




接着是我以实验精神修改过上述编程,把i!=j&&i!=k&&j!=k不能简化为i!=j!=k,却导致运行结果错误。为什么二者结果差这么多?我错在哪里?


none.gif

f5c9a21a

B1F  2023-04-20 00:30
(ooad)
i!=(j!=k)

none.gif

welk

还真不清楚是先执行i!=j还是j!=k
那就随便挑一个先执行i!=j,得到true或者false得到0或1
得到的0或1在和k比
这样就和你的想法不一样了
i=1 j=1 k=1 输出的也是true 1

none.gif

妙语也

B3F  2023-04-20 00:37
(新年快乐朋友们)
会先得出一个布尔值0/1。然后再和i判断

464907.jpg

妹moe

B4F  2023-04-20 00:40
(爱妹妹!)
i!=j!=k

机器按照优先级,会这样理解:首先会判断i!=j,然后将i!=j看作一个整体,比如说就用s来表示i!=j;
如果i不等于j,那么s=1,如果i=j,那么s=0;
接着机器会判断s!=k,由于s只能取0或1;
当s=0时,0!=k恒成立;
当s=1时,k除了1,其他都值都能取(2,3,4)

1539938.jpg

finalsection

B5F  2023-04-20 00:45
(八百标兵奔北坡)
上面说的对,布尔式只能返回布尔值0和1,先计算前面得到0或者1,再之后判断0和1是否不等于第三个数就没什么意义了

none.gif

河洛

B6F  2023-04-20 00:45
(心外无物)
因为!=这个运算符的用法是这么规定的,用法就是比较两个值是否相同然后返回0或1。你这是连基本运算符的用法都不知道就开始编程了。

none.gif

d560b3ec

因为 i!=j 中的这个"!=" 是一个关系运算符,返回的结果是true 或者 false,按照顺序的话 i!=j!=k执行出来就会变成:
i!=j 的结果(True 或 False 或者说 1或0)是否等于k
也就是说 如果 i == j, 就会判断 k 是不是1或True ,如果是返回 True,否则返回False
如果 i != j,就会判断k是不是 0或False,后续同理。
这个时候判断的就不是i,j,k是否互不相同了。
看回初始的程序 (i!=k)&&(j!=k)&&(i!=j),这是通过三个关系预算符先比较i,j,k两两是否都不同,然后再通过&& 的逻辑与运算保证只有在均不同的情况下方才输出True。也就是说在括号内进行的是数值和数值的比较,然后在比较完后在括号外是逻辑运算。

817320.jpg

planarians

B8F  2023-04-20 00:52
(长发RT<hf)
c语言中 !=从左往右结合
先计算左边的不等式“i!=j”。如果这个不等式成立,返回1;否则返回0。
然后,将上一步的结果(0或1)与右边的变量k进行比较。如果两者不相等,则返回1;否则返回0。
所以表达式“i!=j!=k”实际上相当于“(i!=j)!=k”

讲真你没必要钻这些牛角尖 哪怕真能省略 这种问题也就在考试里能见到了
又不是上大学有充分的时间想研究啥研究啥 先赶紧把基础速成了 找份工作 剩下缺的想研究的以后慢慢学

none.gif

24d8d0dd

为什么呢   只能说语法错误 有这时间不如好好的 研究你需要完成的目标 制作网站或者程序 边做边学 不然很枯燥啊

none.gif

木东酱

B10F  2023-04-20 07:31
(老虫)
我擦,这男+隐藏一堆程序员

1671112.jpg

Nostrura

B11F  2023-04-20 07:50
(你好你好)
因为判断也是是计算,a!=b和a+b本质上并无区别
a+b的结果是它们的和,a!=b的结果则是0或1
另外再提一句,就算在数学上,要表示三个数互不相等,也不能写成a≠b≠c,因为≠没有传递性

鸫伽


none.gif

夏青柳

为什么人要吃要排泄,不能直接不吃不排泄?

none.gif

n3ko

因为是从左到右比较的啊。。。
i!=j!=k会被理解为(i!=j)!=k,也就是先进行i!=j的比较,然后将结果和k进行比较,这与i!=j&&i!=k&&j!=k的含义不同。

而i!=j&&i!=k&&j!=k会被理解为(i!=j) && (i!=k) && (j!=k),就是先判断i不等于j,再判断i不等于k,最后判断j不等于k

none.gif

n3ko

之前没有碰过编程的话,前期学习主要是锻炼逻辑,计算机本身是“笨笨”的

none.gif

死亡之翼

B16F  2023-04-20 08:48
(lsp)
为什么可以啊,你这就好像在问1+2*3为什么不能写成(1+2)*3一样

1574159.jpg

robort

B17F  2023-04-20 09:05
(曲径通幽处     必有我插足    已黑化)
转三圈回半圈?

none.gif

变太绅士

为什么我会在黄色网站学代码

135304.png

祇君

B19F  2023-04-20 11:14
(甘えるな)
无意冒犯,但是在基础欠缺的情况下(比如你这里根本没意识到比较运算实际是由两个参数得到单一返回值),所谓的实验精神只是在给自己找麻烦而已。
以及,顺便做一下延伸好了,i!=j!=k 不行,那么,(i != j) != k可以吗,它们表示的又是什么?
附上代码
#include<stdio.h>
#include<stdlib.h>

int main(const int argc, const char* argv[]) {
    if ( argc < 4 ) {
        printf("3 args needed.");
        return 0;
    }
    int var0 = atoi(argv[1]);
    int var1 = atoi(argv[2]);
    int var2 = atoi(argv[3]);
    printf("%d, %d", (var0 != var1), ((var0 != var1) != var2));
    return 0;
}

145757.png

realsheng

规定上不支持你这种理解而已。没为什么,不这么做而已。

冷知识:所有编程语言中,三元运算只有一个 x ? y : z

1070442.jpg

萧莎碧

B21F  2023-04-20 13:33
(如何变成可爱的男孩子)
python可以
别的楼上都说了

1355725.jpg

撸树

B22F  2023-04-20 14:05
(其实这话我本没说过,只是说是我说的人多了,也就变成了我说的)
你应该问问#include为啥不能变成
井incIude
或者
井因哭路

1544698.jpg

遠坂凛

B23F  2023-04-20 14:19
(南+脚本 https://www.south-plus.net/read.php?tid-2086932.html)
问ChatGPT直接有答案

1592148.jpg

16f0ebec

回 19楼(祇君) 的帖子

谢谢你的建议,希望你我日后多交流。

none.gif

Rookie

我看过楼主的很多帖子,问得很多问题根源都在于:没有把编程语言视为一门语言。请楼主严格按照书或者网上的语法来编写代码。
计算机科学是数学的分支,楼主一定学过数学,做过数学题。楼主回想一下,你是怎么做数学题的。做证明题、解方程的时候是不是要按照规定的格式?格式不对或者步骤不对,即使答案对了也不能得满分。你可以认为你写的答案是一门数学语言,是你和老师沟通的工具。你们按照约定的方式(格式)沟通,老师看懂了,你就得分了。
回到代码,代码也是你和计算机沟通的语言,写代码的目的是为了让计算机看懂,所以请楼主一定要按照这门语言提供的语法(格式)来写,否则乱写一气,得到的只能是编译错误。运气更差地,你误打误撞写到了别的语法,被计算机误解,成功运行却得不到想要的结果,那么错误就更难找了。
楼主这次的问题是逻辑判断,语言规定:两个变量不等关系的写法是a!=b,如果你需要三个变量两两不等 ,那么就需要ab,bc,ca三个不等于关系都成立,自然把三个关系用&&连接起来,这就是标准的写法。
楼主提到简化,那只能是一厢情愿,因为计算机根本看不懂你的简化写法,这次其实是计算机误解成其他的意思了。如何避免这件事情呢?**就是严格按照你学过的语法写代码。**你只学过两个变量的不等关系应该怎么写,你应该用两个变量的不等式去拼凑成三个变量的,而不是自创一种写法。
不要在语法上做简化,那是语言制定者的事情。但是我们可以在逻辑上做简化,比如说,我希望i,j,k三个变量两两相等,本来应该是i==j&&j==k&&k==i,那么就可以简化成i==j&&j==k,因为当前两个关系满足时,第三个也自动满足了,不需要再判断一次了。这就是逻辑上的简化,希望楼主理解一下这个例子和你的问题两者之间的不同,加深一下印象。
最后,告诉楼主你之所以有这个问题,是因为**【表达式】、【运算符】**这些概念没学好,或者是没有学过。因此我在这里故意避免使用表达式,运算符等字眼来解释问题。楼主可以参考书上有关章节或者百度搜索【c++表达式 运算符】,有很多博客讲的很清晰。
楼主自学写代码,值得鼓励,请继续加油!

1.gif

f8acdade

B26F  2023-04-20 15:32
(my life belongs to the dark side)
形式语言不是也不需要是自然语言,点到为止

513448.jpg

虾米

B27F  2023-04-20 15:41
(重口什么的最喜欢了)
我甚至可以在黄色网站学编程

a10.gif

布尔希德

B28F  2023-04-20 15:47
(errrrrrrrrrrrrrrrrrrrrr......)
为什么你要吃饭?语法规定了就这样
不服?可以啊,拿llvm自己设计一个就行, 别说 i!=j!=k这样了  ijk!=  这样都行

none.gif

影旅者

i!=j&&i!=k&&j!=k
首先&&是有断路作用的,即第一个条件为false,就不会走之后的了,然后i!=j!=k 是两个部分吧,我是从来没有这么写过应该是i!=j!&&j!=k 但是k==i可以,这是我的浅薄理解,欢迎斧正

1592148.jpg

16f0ebec

回 25楼(Rookie) 的帖子

谢谢你写了这么多字回复我,谢谢你真心教导我。希望你我日后多交流。
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go