算术 C++ 运算符

Posted

技术标签:

【中文标题】算术 C++ 运算符【英文标题】:Arithmetic C++ Operators 【发布时间】:2012-10-10 10:51:09 【问题描述】:

我刚刚在一次技术面试中被问到一个让我有点困惑的问题。

问题如下:

如果

int i = -1, int j = -1, and int k = -1, 

我们运行以下行:

++i && ++j && ++k

i、j 和 k 的新值是多少?我感到困惑的原因是,由于我们没有将这个表达式分配给任何东西,看起来 and 运算符应该没有任何区别(只有增量运算符应该)。然而,运行一个简单的测试程序很快证明我错了。有人可以向我解释一下吗,因为我以前从未见过这个练习。

【问题讨论】:

反问:这取决于ijk的类型是什么? 面试官提到它们是整数,我只是在问题中忽略了这样做。我会解决的。 【参考方案1】:

在这种情况下,++i 表达式的值是0,也就是说 false,因此永远不会计算 and 操作快捷方式和后面的表达式。

【讨论】:

【参考方案2】:

这里的关键是&&是短路的。

因此,首先评估 ++i。它递增i 并返回新值0,因此不会计算表达式的其余部分。

如果我没记错的话,值应该是0, -1, -1

【讨论】:

@JohnRoberts 好吧......那会违背采访的目的,不是吗? :P @LuchianGrigore:嗯……不一定。逻辑操作中的“短路”是不熟悉该语言的人可能不知道的细节。但是一旦被告知,你可以看到他推理的能力。这样问,看起来问题更多的是检查语法知识,而不是解决问题的能力。本身并不是一件坏事,但至少它应该被宣布,而不是被发现。 @EmilioGaravaglia 哦,我同意。 IMO 这不是一个好的面试问题。正是这些类型的小挑剔在评估某人时根本没有用。我的观点是,我认为问这个问题就像问“你知道什么是短路吗?”,只是伪装在代码中。 这是一个糟糕的面试问题。而且那个代码也很糟糕。 @Andreas 如果您将“C/C++ 专家”放在您的简历中,那么您显然不是。 :D

以上是关于算术 C++ 运算符的主要内容,如果未能解决你的问题,请参考以下文章

C++算术运算符

算术 C++ 运算符

1.8 C++算术运算符

C++指针的算术运算 关系运算

使用 n 维 C++ Vector 类实现算术运算符重载的更好方法?

C++ 指针警告:算术溢出:对 4 字节值使用运算符“-”,然后将结果转换为 8 字节值