为什么C语言需要在if语句中围绕一个简单条件的parens?

Igo*_*aka 28 javascript c c# c++ java

这听起来很愚蠢,但多年来我一直无法想出一个需要这个的用例.快速谷歌搜索没有透露任何值得的东西.

从内存中有一个Bjarne Stroustrup提到的用例,但我找不到它的引用.

那你为什么不能用C语言呢:

int val = 0;
if val
  doSomehing();
else
  doSomehinglse();
Run Code Online (Sandbox Code Playgroud)

我可以接受"我们不能为词法分析添加支持"的原因,我只想弄清楚这种语法是否打破了其他语言结构.考虑到C/C++中有多少令人讨厌的语法特性,我几乎不认为这会增加很多复杂性.

Tam*_*ege 49

如果if构造中的表达式周围没有括号,则以下语句的含义是什么?

if x * x * b = NULL;
Run Code Online (Sandbox Code Playgroud)

是吗

if (x*x)
    (*b) = NULL;
Run Code Online (Sandbox Code Playgroud)

或者是它

if (x)
    (*x) * b = NULL;
Run Code Online (Sandbox Code Playgroud)

(当然这些都是愚蠢的例子,甚至没有明显的原因,但你明白了)

TLDR:C中需要使用括号来消除任何语法模糊的可能性.

  • 克里斯:重点是,LR解析器需要能够决定条件的结束位置和条件块的开始位置.不同的语言有不同的方法,有些需要括号,有些是换行符,有些则有"then"关键字.你无法解决这个问题.显示_one_语言没有某种机制将条件表达式与条件块以某种方式分离.如果您仍然不相信我,请尝试使用yacc构建您自己的语言语法,您将看到所有会出现的问题. (11认同)
  • 这对这个问题来说真的不是一个好的答案.C严格规定了运营商的运营顺序.如果这是有效的语法,它将被评估为if(NULL)因为*优先于=并且赋值的返回值是赋值,并且没有逻辑上的理由为什么编译器不需要括号围绕条件会在if之后拆分语句(看看python语法). (3认同)
  • @Chris:即使有一种不明智的方式来解析它,它也会不那么明显,而且难以阅读,因此是一个坏主意.例如,我总是在嵌套和/或非条件下添加额外的parens,即使它们不是必需的.节省每个人思考隐含优先级如何发挥作用的时间. (3认同)

whe*_*ies 12

告诉我如何interprit以下:

if x ++ b;
Run Code Online (Sandbox Code Playgroud)

看起来很傻但......

if( x ) ++b;
Run Code Online (Sandbox Code Playgroud)

要么

if( x++ ) b;
Run Code Online (Sandbox Code Playgroud)

或者"x"有一个重载运算符然后......

if( x ++ b){;}
Run Code Online (Sandbox Code Playgroud)

编辑:

正如Martin York指出的那样,"++"具有更高的优先级,这就是为什么我必须添加运算符重载tidbit.在处理现代编译器时,他是完全正确的,直到你允许C++附带的所有重载优点.

  • 后增量具有更高的优先级.所以最后一个.更好的是x + b; 这是if(x + b){;}还是if(x){+ b;} (4认同)
  • 或者更常见的是`if x - b`,因为一元减号比一元加号更熟悉. (3认同)

Rex*_*x M 5

我认为更好的问题是“我们为什么想要这样的东西?” 而不是“为什么我们没有它?”。它在词法分析器中引入了另一个不必要的边缘情况,这样您就可以避免输入 4 个额外的字符;并通过允许已经支持所有可能情况的简单语法的例外来增加规范的复杂性。更不用说要注意歧义,这在编程语言中没有多大价值。

  • 许多语言允许省略括号,减少噪音总是有助于清晰度。假装这是某种无法克服的障碍有点愚蠢。最后一部分更有趣。您能“想到”任何会引起歧义的情况吗?否则你的答案似乎只不过是“括号对我来说总是足够好!不要来这里暗示我的语言不完美” (5认同)
  • @jalf - “......减少噪音总是有助于清晰度......”显然是不真实的。作为一个简单的反例,你认为为什么有些人会添加完全不必要的括号?因为**对于某些人**来说,多余的括号有助于清晰! (2认同)