请耐心等待我,我正在努力学习C语言作为我的第一门编程语言而且只有15分钟。
为什么必须在这里使用括号:
while ((number1 = number2))
......什么时候不需要在这里使用?
while (number1 <= number2)
提前致谢。
答案 0 :(得分:2)
在:
while (number1 = number2)
number2
被分配到number1
。
这在光学上非常类似于比较number1
和number2
,即:
while (number1 == number2)
因此在前一种情况下会产生警告。为了取消该警告,您需要在括号周围放置括号,即:
while ((number1 = number2))
答案 1 :(得分:2)
编写
是一个非常的常见错误if ( a = b ) // assign b to a, branch if result is non-zero
当你打算写
时if ( a == b ) // *compare* b to a, branch if equal
导致各种混乱。
这是一个常见的错误,如果大多数编译器看到像这样的条件中的赋值,它就会发出警告。告诉编译器,&#34;不,我真的知道我在做什么&#34;,你在一组额外的括号中包围了作业:
if ( ( a = b ) )
这基本上意味着,&#34;是的,我打算将b
分配给a
并对结果进行分支,闭嘴。&#34;
如果我可以在1970年回到贝尔实验室,这是我对里奇拍打的几个决定之一。如果赋值运算符为:=
或与比较不同的东西,则永远不会存在整类错误。
答案 2 :(得分:1)
谁说有必须?你也可以省略它。
while (number1 = number2)
是的,这会产生编译器警告 ,因为您正在分配和检查没有括号的指定值。 但这是合法和不良做法。
所以他们这样做的原因是为了避免编译器抱怨的警告。(你不应该跳过警告以遵循不好的做法 - 而是允许编译器警告并尝试解决他们勤奋地)。
虽然你是初学者 - 知道这个陈述,但while
陈述基本上是
while(number2)
要点:最常用的是while(number1 == number2)
。
也和前一个一样。谁在第二个中说你不能?你可以。
while ((number1 <= number2))
答案 3 :(得分:0)
这是一个意见问题。为清晰起见,许多程序员仍然会在括号中进行比较。那是为了让它们更清晰。例如:
while(i == 0) //comparison
while(i = 0) //assignment (and therefore, infinite loop)
但更常见的是,因为条件链变得非常难以阅读,并且养成比较括号的习惯使得复杂的比较更容易理解:
//whiskey tango foxtrot
while(i == 0 || j == i && k == 5 || f == "pancakes")
//oh, now it's clear that we're not checking "i && k". Easier to read!
while((i == 0) || (j == i) && (k == 5) || (f == "pancakes"))
//now I've guaranteed i and j both have the value "0" by using parentheses,
//or we get false; but everything is still clearly separated.
while(((i == 0) || (j == i)) && (k == 5) || (f == "pancakes"))
答案 4 :(得分:0)
首先,第一个例子是非常不良做法。它没有比较number1
和number2
,而是将number1
的值设置为number2
的值。有关更多信息,请参阅https://freedom-to-tinker.com/2013/10/09/the-linux-backdoor-attempt-of-2003/。
尽管如此,两种形式都是允许的;你总是可以添加额外的括号。如果您有上述情况,则没有区别。
那就是说,从多个条件被链接在一起的例子中简化你很可能,例如
while ((number1 == number2) || (number3 == number4))
正如您所看到的,它使得查看代码的功能变得容易一些。从技术上讲,它在这里并不是必需的(虽然它通常被认为是一种好的做法),但对于更复杂的表达可能是必要的,因为对operator precedence的不同期望会导致你的代码做你可能没想到的事情。从该页面中获取示例,例如
e = a < d ? a++ : a = d;
即使想要弄清楚发生了什么,也可能需要一些时间,不太熟悉C的人可能需要更长的时间。另一方面,如果添加括号:
e = ( ((a < d) ? (a++) : a) = d );
事情变得更容易阅读。