关于C中括号的一些混淆

时间:2018-01-26 18:43:55

标签: c gcc

请耐心等待我,我正在努力学习C语言作为我的第一门编程语言而且只有15分钟。

为什么必须在这里使用括号:

while ((number1 = number2))

......什么时候不需要在这里使用?

while (number1 <= number2)

提前致谢。

5 个答案:

答案 0 :(得分:2)

在:

while (number1 = number2)

number2被分配到number1

这在光学上非常类似于比较number1number2,即:

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)

首先,第一个例子是非常不良做法。它没有比较number1number2,而是将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 );

事情变得更容易阅读。