标签: sequence-points

这段代码是否定义明确?

此代码取自此处的讨论.

someInstance.Fun(++k).Gun(10).Sun(k).Tun();
Run Code Online (Sandbox Code Playgroud)

这段代码是否定义明确?是否++kkSun()之前评估过Fun ()?

如果k是用户定义的类型,而不是内置类型怎么办?以上函数调用顺序的方式与此不同:

eat(++k);drink(10);sleep(k);
Run Code Online (Sandbox Code Playgroud)

据我所知,在这两种情况下,每个函数调用后都存在一个序列点.如果是这样,为什么第一个案例也不能像第二个案例那样明确定义?

C++ ISO标准的1.9.17部分对序列点和功能评估进行了说明:

在调用函数时(无论函数是否为内联函数),在评估函数体中任何表达式或语句之前发生的所有函数参数(如果有) 之后,都会有 一个序列点.在复制返回值之后和执行函数外部的任何表达式之前,还有一个 序列点.

c++ operator-precedence sequence-points

27
推荐指数
4
解决办法
1758
查看次数

前缀(++ x)和后缀(x ++)操作如何工作?

有人能告诉我前缀/后缀运算符是如何工作的吗?我一直在网上看很多但没找到任何东西.

从我可以告诉prefex第一个增量,然后执行操作,然后分配.
Postfix将首先执行操作,然后分配然后递增.

但是我的代码遇到了一些麻烦:

int x, y;
x = 1;
y = x + x++; // (After operation y = 2)(x=2)
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时:

y = x++ + x; // (After operation y = 3)(x=2)
Run Code Online (Sandbox Code Playgroud)

我不确定为什么这些操作会有所不同.我有两个问题:

  • 你能解释一下这个区别吗?

  • 这如何适用于其他运营商Prefix?

c c# c++ sequence-points

26
推荐指数
4
解决办法
2万
查看次数

语句'int val =(++ i> ++ j)吗?++ i:++ j;`调用未定义的行为?

给定以下程序:

#include <stdio.h>
int main(void)
{
    int i = 1, j = 2;
    int val = (++i > ++j) ? ++i : ++j;
    printf("%d\n", val); // prints 4
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

的初始化val似乎可能隐藏了一些未定义的行为,但是我看不到对象被多次修改或在其间没有序列点的情况下被修改和使用的任何地方。有人可以对此进行纠正或证实吗?

c ternary-operator sequence-points

24
推荐指数
3
解决办法
1655
查看次数

当将变量分配给对其自身的引用时,在修改然后由函数调用返回之间,结果应该是什么?

#include <iostream>

int& addOne(int& x)
{
    x += 1;
    return x;
}

int main()
{
    int x {5};
    addOne(x) = x;
    std::cout << x << ' ' << addOne(x);
}
Run Code Online (Sandbox Code Playgroud)

我目前正在学习左值和右值,并进行了一些实验,并做出了这似乎得到了相互矛盾的结果。 https://godbolt.org/z/KqsGz3Toe产生的输出为“5 6”,Clion 和 Visual Studio 也是如此,但是https://www.onlinegdb.com/49mUC7x8U产生的结果为“6 7”

我认为,因为addOne作为引用调用,所以尽管被称为左值,x它仍会显式地将 的值更改为 6。x正确的结果应该是什么?

c++ sequence-points

22
推荐指数
1
解决办法
2064
查看次数

赋值运算符不是序列点的任何好理由?

有没有什么理由operator =不成为序列点?在C和C++中都有.

我很难想到一个反例.

c c++ sequence-points

21
推荐指数
1
解决办法
2621
查看次数

是i = f(); 当f修改i时定义?

相关问题:赋值运算符不是序列点的任何充分理由?

comp.lang.c FAQ我会推断下面的程序是未定义的.奇怪的是,它只是f在参数计算和控制转移之间提到了作为序列点的调用f.从f后面到调用表达式的控制转移未列为序列点.

int f(void) { i++; return 42; }
i = f();
Run Code Online (Sandbox Code Playgroud)

它真的未定义吗?

作为我在我的许多问题中添加的最后一点,我对静态分析的背景感兴趣.我不是自己写的,我只是想知道我是否应该在其他人编写的程序中对此进行警告.

c c99 sequence-points

21
推荐指数
2
解决办法
361
查看次数

变量列表中的逗号是序列点吗?

在下面的代码类型中,每个变量构造之间是否有一个序列点,或者结果是否未定义?

int a = 0;
int b = a++, c = a++;
Run Code Online (Sandbox Code Playgroud)

我无法在标准中找到这里对序列点的具体引用.这是否意味着它是未定义的,或者只是我在搜索中失败了?表达式的完成是一个序列点,但上面的初始化也算了吗?

c++ variables comma sequence-points

21
推荐指数
2
解决办法
1230
查看次数

*&++我在C++ 03中导致未定义的行为吗?

另一个答案有人指出,之前C++ 11,其中i是一个int,则使用表达式:

*&++i
Run Code Online (Sandbox Code Playgroud)

导致未定义的行为.这是真的?

另一个答案是在评论中进行了一些讨论,但似乎并不令人信服.

c++ undefined-behavior sequence-points language-lawyer c++03

21
推荐指数
2
解决办法
321
查看次数

为什么表达式a = a + b - (b = a)在c ++中给出了一个序列点警告?

以下是测试代码:

int main()
{
    int a = 3;
    int b = 4;
    a = a + b - (b = a); 

    cout << "a :" << a << " " << "b :" << b << "\n";    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译它会发出以下警告:

> $ g++ -Wall -o test test.cpp test.cpp: In function ‘int main()’:
> test.cpp:11:21: warning: operation on ‘b’ may be undefined
> [-Wsequence-point]
Run Code Online (Sandbox Code Playgroud)

为什么操作不确定?

根据我的理解,首先(b = a)应该评估子表达式,因为()的优先级更高,因此设置b = a.然后,由于'+'和' - '具有相同的优先级,因此表达式将以左关联方式进行计算.因此,a + b应该接下来评估,最后(b = …

c++ operators operator-precedence sequence-points

20
推荐指数
2
解决办法
2129
查看次数

int a = 1,b = a ++; 调用未定义的行为?

是否int a=1, b=a++;调用未定义的行为?在初始化器中初始化a及其访问和修改之间没有序列点介入b,但据我所知,初始化不是对象的"修改"; 指定初始值设定项以提供对象的"初始值".根据6.7.8初始化,第8段:

初始值设定项指定存储在对象中的初始值.

在对对象进行任何访问之前,将"initial"作为顺序进行似乎是合理的.此问题是否已经考虑过,是否有可接受的解释?

c undefined-behavior sequence-points language-lawyer

18
推荐指数
1
解决办法
982
查看次数