相关疑难解决方法(0)

重新加载未定义的行为和序列点

将此主题视为以下主题的续篇:

上一部分
未定义的行为和序列点

让我们重新审视这个有趣复杂的表达(斜体短语取自上述主题*smile*):

i += ++i;
Run Code Online (Sandbox Code Playgroud)

我们说这会调用undefined-behavior.我假定说这个的时候,我们隐含假设i是内置的类型之一.

如果什么类型i是用户定义类型?比如它的类型是Index在本文后面定义的(见下文).它还会调用未定义的行为吗?

如果是,为什么?它不等同于写作i.operator+=(i.operator++());甚至语法上更简单 i.add(i.inc());吗?或者,他们是否也调用未定义的行为?

如果不是,为什么不呢?毕竟,对象在连续的序列点之间i被修改两次.请回想一下经验法则:表达式只能在连续的"序列点"之间修改一个对象的值.如果 i += ++i是表达式,那么它必须调用未定义的行为.如果是,那么它的等价物i.operator+=(i.operator++());i.add(i.inc());必须调用undefined-behavior似乎是不真实的!(据我所知)

或者,i += ++i不是一个开头的表达?如果是这样,那么它是什么以及表达式的定义是什么?

如果它是一个表达式,并在同一时间,其行为也是定义良好的,那么就意味着与表达相关序列点的数量在某种程度上取决于该类型的参与表达操作数.我是否正确(甚至部分)?


顺便问一下,这个表达怎么样?

//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the …
Run Code Online (Sandbox Code Playgroud)

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

84
推荐指数
5
解决办法
1万
查看次数

如果int不是类,为什么int x = int(5)合法?

根据我的理解,在c ++中实例化一个整数是合法的,如下所示:

int x = int(5);
Run Code Online (Sandbox Code Playgroud)

作为Java程序员,我假设这行代码调用传递"5"作为参数的整数的构造函数.我读过虽然int不是一个类,因此没有构造函数.

那么,在那行代码中究竟发生了什么,以及通过这种方式初始化int之间的根本区别是什么:

int x = 5;
Run Code Online (Sandbox Code Playgroud)

提前致谢!

c++ primitive constructor initialization

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

C++ for循环语法

我是C的新手,并不理解这种类型的for循环语法.

for(int i(9), j(0); i > j; i--, j++)
cout << i;
Run Code Online (Sandbox Code Playgroud)

这给出了98765的结果,但为什么呢?

我习惯了这样的循环:

for(int i = 9, int j = 0; i>j; i--, j++){
 System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

我看到我被初始化为9,j被初始化为0,但它是如何得到一个那么大的数字?

c++ for-loop

-4
推荐指数
1
解决办法
381
查看次数