代码之家  ›  专栏  ›  技术社区  ›  SmacL

在C++和C++中使用逗号代替半冒号的效果

c c++
  •  57
  • SmacL  · 技术社区  · 15 年前

    我注意到在很多时候,重构C和C++代码的不同部分,使用逗号而不是半冒号来分隔语句。像这样的东西;

    int a = 0, b = 0;
    a = 5, b = 5;
    

    我本该想到的地方

    int a = 0, b = 0;
    a = 5; b = 5;
    

    我知道C和C++允许使用逗号分隔语句(特别是循环头),但是这两段代码之间有什么区别呢?我猜逗号是由于剪切和粘贴而留下的,但它是一个bug吗?它会影响执行吗?

    5 回复  |  直到 6 年前
        1
  •  88
  •   AustinWBryan ravenspoint    6 年前

    这对你发布的代码没有影响。一般来说,逗号就像分号一样分隔表达式,但是,如果将整个表达式作为表达式,则逗号运算符意味着表达式的计算结果是最后一个参数。

    下面是一个例子:

    b = (3, 5);
    

    将评估3,然后5,并将后者分配给b。 b = 5 . 请注意,括号在这里很重要:

    b = 3, 5;
    

    将评估 b = 3 ,那么5,整个表达式的结果是5。 b == 3 .

    当迭代器代码不是简单的代码时,逗号运算符对于循环特别有用。 i++ ,但您需要执行多个命令。在这种情况下,分号不适合for循环语法。

        2
  •  22
  •   x4u    15 年前

    逗号是一个返回值的运算符,该值始终是第二个(右)参数,而分号只结束语句。它允许逗号运算符在其他语句中使用,或将多个语句连接为一个语句。

    这里调用函数f(x),然后 x > y 为if语句计算。

    if( y = f(x), x > y )
    

    一个例子,当它只是用来避免需要块

    if( ... )
       x = 2, y = 3;
    
    if( ... ) {
       x = 2;
       y = 3;
    }
    
        3
  •  7
  •   UncleBens    15 年前

    逗号运算符从左到右计算所有操作数,结果是最后一个操作数的值。

    如果要在“增量”部分执行多个操作,例如(反转字符串),则在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;
        ...
    }
    
        4
  •  4
  •   AustinWBryan ravenspoint    6 年前

    一种用法是在代码高尔夫中使用:

    if (x == 1) y = 2, z = 3;
    if (x == 1) { y = 2; z = 3; }
    

    第一行比较短,但在常规开发中使用起来太混乱了。

        5
  •  3
  •   Community PPrice    7 年前

    作为 Frank mentioned ,在示例中如何使用逗号运算符不会导致错误。逗号运算符可能会混淆,原因如下:

    • 这种情况不太常见,因为只有在某些特殊情况下才有必要
    • 逗号还有几种其他的语法用法,看起来像逗号运算符,但它们不是(用于分隔函数参数/参数的逗号,用于分隔变量声明或初始值设定项的逗号)

    由于逗号运算符容易混淆,而且常常是不必要的,因此应避免使用逗号运算符,但某些非常特殊的情况除外:

    • 在一个或多个 for 语句的控制表达式
    • 它可以在预处理器宏中用于计算单个语句中的多个表达式。这通常是为了允许宏执行多个操作,并且仍然是单个表达式,因此宏将“适应”于只允许表达式的位置。

    逗号操作符在定义上几乎是一个黑客操作符——它是在只允许一个的情况下,对两个对象进行黑客操作。它几乎总是难看的,但有时你只有这些。这是唯一一次你应该使用它-如果你有其他的选择,不要使用逗号操作符。

    从我的头顶上看,我想不出使用该运算符的其他原因,因为在大多数其他情况下,您可以通过在单独的语句中评估表达式来获得类似的效果(尽管我确信有人会对我忽略的另一种用法发表评论)。