此代码取自此处的讨论.
someInstance.Fun(++k).Gun(10).Sun(k).Tun();
Run Code Online (Sandbox Code Playgroud)
这段代码是否定义明确?是否++k在kSun()之前评估过Fun ()?
如果k是用户定义的类型,而不是内置类型怎么办?以上函数调用顺序的方式与此不同:
eat(++k);drink(10);sleep(k);
Run Code Online (Sandbox Code Playgroud)
据我所知,在这两种情况下,每个函数调用后都存在一个序列点.如果是这样,为什么第一个案例也不能像第二个案例那样明确定义?
C++ ISO标准的1.9.17部分对序列点和功能评估进行了说明:
在调用函数时(无论函数是否为内联函数),在评估函数体中任何表达式或语句之前发生的所有函数参数(如果有) 之后,都会有 一个序列点.在复制返回值之后和执行函数外部的任何表达式之前,还有一个 序列点.
有人能告诉我前缀/后缀运算符是如何工作的吗?我一直在网上看很多但没找到任何东西.
从我可以告诉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?
给定以下程序:
#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似乎可能隐藏了一些未定义的行为,但是我看不到对象被多次修改或在其间没有序列点的情况下被修改和使用的任何地方。有人可以对此进行纠正或证实吗?
#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正确的结果应该是什么?
有没有什么理由operator =不成为序列点?在C和C++中都有.
我很难想到一个反例.
相关问题:赋值运算符不是序列点的任何充分理由?
从comp.lang.c FAQ我会推断下面的程序是未定义的.奇怪的是,它只是f在参数计算和控制转移之间提到了作为序列点的调用f.从f后面到调用表达式的控制转移未列为序列点.
int f(void) { i++; return 42; }
i = f();
Run Code Online (Sandbox Code Playgroud)
它真的未定义吗?
作为我在我的许多问题中添加的最后一点,我对静态分析的背景感兴趣.我不是自己写的,我只是想知道我是否应该在其他人编写的程序中对此进行警告.
在下面的代码类型中,每个变量构造之间是否有一个序列点,或者结果是否未定义?
int a = 0;
int b = a++, c = a++;
Run Code Online (Sandbox Code Playgroud)
我无法在标准中找到这里对序列点的具体引用.这是否意味着它是未定义的,或者只是我在搜索中失败了?表达式的完成是一个序列点,但上面的初始化也算了吗?
在另一个答案有人指出,之前C++ 11,其中i是一个int,则使用表达式:
*&++i
Run Code Online (Sandbox Code Playgroud)
导致未定义的行为.这是真的?
另一个答案是在评论中进行了一些讨论,但似乎并不令人信服.
c++ undefined-behavior sequence-points language-lawyer c++03
以下是测试代码:
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 = …
是否int a=1, b=a++;调用未定义的行为?在初始化器中初始化a及其访问和修改之间没有序列点介入b,但据我所知,初始化不是对象的"修改"; 指定初始值设定项以提供对象的"初始值".根据6.7.8初始化,第8段:
初始值设定项指定存储在对象中的初始值.
在对对象进行任何访问之前,将"initial"作为顺序进行似乎是合理的.此问题是否已经考虑过,是否有可接受的解释?