相关疑难解决方法(0)

未定义的行为和序列点

什么是"序列点"?

未定义的行为和序列点之间的关系是什么?

我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?

如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ c++-faq undefined-behavior sequence-points

970
推荐指数
4
解决办法
10万
查看次数

为什么这些构造使用前后增量未定义的行为?

#include <stdio.h>

int main(void)
{
   int i = 0;
   i = i++ + ++i;
   printf("%d\n", i); // 3

   i = 1;
   i = (i++);
   printf("%d\n", i); // 2 Should be 1, no ?

   volatile int u = 0;
   u = u++ + ++u;
   printf("%d\n", u); // 1

   u = 1;
   u = (u++);
   printf("%d\n", u); // 2 Should also be one, no ?

   register int v = 0;
   v = v++ + ++v;
   printf("%d\n", v); // 3 (Should be the …
Run Code Online (Sandbox Code Playgroud)

c increment operator-precedence undefined-behavior sequence-points

793
推荐指数
13
解决办法
7万
查看次数

语法与算子相关性之间的关系

一些编译器书籍/文章/论文谈论语法的设计及其运算符的关联性的关系.我是自上而下的狂热粉丝,特别是递归下降,解析器和迄今为止我编写的大多数(如果不是全部)编译器都使用以下表达式语法:

Expr   ::= Term { ( "+" | "-" ) Term }
Term   ::= Factor { ( "*" | "/" ) Factor }
Factor ::= INTEGER | "(" Expr ")"
Run Code Online (Sandbox Code Playgroud)

这是该BNF的EBNF表示:

Expr  ::= Term Expr'
Expr' ::= ( "+" | "-" ) Term Expr' | ?
Term  ::= Factor Term'
Term' ::= ( "*" | "/" ) Factor Term' | ?
Factor = INTEGER | "(" Expr ")"
Run Code Online (Sandbox Code Playgroud)

根据我所读到的,有些人认为这种语法是"错误的",因为操作员关联性的变化(这4个操作员从左到右)由不断增长的解析树向右而不是向左证明.对于通过属性语法实现的解析器,这可能是正确的,因为l-attribute值要求首先创建此值,然后传递给子节点.然而,当使用普通的递归下降解析器实现时,由我决定是先构造此节点然后传递给子节点(自上而下)还是先创建子节点然后将返回的值添加为此节点的子节点(通过在这个节点的构造函数中)(自下而上).我应该在这里找到一些东西,因为我不同意这句话说这个语法是"错误的",而且这种语法已被用于许多语言中.Wirthian的.通常(或全部?)表示它的读数会促进LR解析而不是LL.

parsing associativity operator-keyword

6
推荐指数
1
解决办法
1351
查看次数

运算符优先..()和++

敬礼..

我有一个不寻常的问题. 在MSDN库的这个表中,我们可以看到()的优先级高于++(预增量).但是当我运行这段代码时,似乎++(prefex)的优先级更高:

int main()
{
    int a=3,b=2,x;
    x=++a + (a-b);
    cout<<"x= "<<x;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

答案是:

X = 6

仅在prefex ++中发生这种情况,并且按照我预期的后增量工作.

有什么缘故吗?问候..

int main()
{
    int a=3,b=2,x;
    x=a++ + (a-b);
    cout<<"x= "<<x;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

X = 4

(我使用的是Microsoft Visual C++ 2010快递)

c++ operator-precedence pre-increment post-increment

1
推荐指数
2
解决办法
1279
查看次数