在重构C和C ++的各种代码时,我注意到很多时候使用逗号而不是分号来分隔语句。像这样的东西;
int a = 0, b = 0;
a = 5, b = 5;
我本来期望的
int a = 0, b = 0;
a = 5; b = 5;
我知道C和C ++允许使用逗号分隔语句(特别是循环头),但是这两段代码之间有什么区别?我的猜测是逗号是剪切和粘贴的结果,但这是一个错误,会影响执行吗?
在重构C和C ++的各种代码时,我注意到很多时候使用逗号而不是分号来分隔语句。像这样的东西;
int a = 0, b = 0;
a = 5, b = 5;
我本来期望的
int a = 0, b = 0;
a = 5; b = 5;
我知道C和C ++允许使用逗号分隔语句(特别是循环头),但是这两段代码之间有什么区别?我的猜测是逗号是剪切和粘贴的结果,但这是一个错误,会影响执行吗?
int* a, b;与int* a; int* b;
int *a, b;
Answers:
它与您发布的代码没有任何区别。通常,逗号像分号一样分隔表达式,但是,如果将整体作为表达式,则逗号运算符意味着表达式的计算结果为最后一个参数。
这是一个例子:
b = (3, 5);
将求值3,然后是5,并将后者分配给b。这样b = 5。请注意,括号在这里很重要:
b = 3, 5;
b = 3尽管如此,将求值,然后5,而整个表达式的结果是5 b == 3。
当您的迭代器代码不是简单的i++,但是您需要执行多个命令时,逗号运算符在for循环中特别有用。在这种情况下,分号不能与for循环语法配合使用。
a[j, k]而不是a[j][k]通常会导致意外的结果。
逗号运算符从左到右评估所有操作数,结果是最后一个操作数的值。
如果要在“增量”部分中执行多个操作,例如,(反转字符串),它在for循环中最有用。
for (int lower = 0, upper = s.size() - 1; lower < upper; ++lower, --upper)
std::swap(s[lower], s[upper]);
另一个示例,它可能是一个选项(查找字符串中的所有匹配项):
#include <string>
#include <iostream>
int main()
{
std::string s("abracadabra");
size_t search_position = 0;
size_t position = 0;
while (position = s.find('a', search_position), position != std::string::npos) {
std::cout << position << '\n';
search_position = position + 1;
}
}
特别是,逻辑和不能用于此条件,因为零和非零都可以表示在字符串中找到了字符。另一方面,使用逗号时,position = s.find()每次在评估条件时都会调用它,但是这部分条件的结果只会被忽略。
当然,还有其他编写循环的方法:
while ((position = s.find('a', search_position)) != std::string::npos)
要不就
while (true) {
position = s.find('a', search_position);
if (position == std::string::npos)
break;
...
}
正如Frank所提到的,在示例中如何使用逗号运算符不会引起错误。逗号运算符可能由于以下几个原因而令人困惑:
由于它令人困惑且通常是不必要的,因此应避免使用逗号运算符,除非有非常特殊的情况:
for语句的控制表达式中执行多个操作可能很有用从定义上说,逗号运算符实际上是一种hackish运算符-它只允许黑客入侵两件事。这几乎总是很难看的,但是有时候这就是你所拥有的。这是您唯一应该使用它的时间-如果您还有其他选择,请不要使用逗号运算符。
我想不起使用该运算符的其他太多原因,因为在大多数其他情况下,您可以通过在单独的语句中评估这些表达式来获得类似的效果(尽管我确信有人会对此发表评论)我忽略的另一种用途)。
一种用法是在代码高尔夫中使用:
if (x == 1) y = 2, z = 3;
if (x == 1) { y = 2; z = 3; }
第一行较短,但是看起来太混乱了,无法在常规开发中使用。
{y=2;z=3;}
int a = 0, b = 0;。