逗号,在 C 语言里既可以作为逗号运算符也可以作为分隔符比如函数参数分隔、变量声明分隔。本文重点讲的是逗号运算符。一、逗号运算符是什么逗号运算符Comma Operator是 C 语言中的一个二元运算符其作用是依次计算逗号左边的表达式然后计算右边的表达式整个逗号表达式的值和类型为右边表达式的值和类型。即1(e1, e2)先计算e1丢弃其结果再计算e2整个表达式的值为e2的值。二、逗号运算符的语法和优先级语法1expression1 , expression2优先级逗号运算符的优先级是所有运算符中最低的仅比赋值表达式 () 和条件表达式 (?:) 优先级低。优先级表里逗号运算符是最末的且结合性是左结合。所以小括号很重要通常需要用括号明确表达式边界。三、逗号运算符的应用场景在循环中执行多条表达式123for(inti 0, j 0; i 10; i, j 2) {printf(i%d, j%d\n, i, j);}这里i, j 2中的逗号是逗号运算符使得两条表达式得以连续执行。在 return 语句或赋值中执行多步命令12intx;x (printf(Hello ), 42);打印“Hello ”再赋值42给x。宏定义中的多步操作1#define SWAP(a, b) do { int tmp a; a b; b tmp; } while(0)虽然用多条语句但如果一定要用逗号运算符可以写成1#define SWAP(a, b) ((a) ! (b) ((a) ^ (b), (b) ^ (a), (a) ^ (b)))利用逗号运算符依次执行三条异或交换表达式。四、逗号运算符与逗号分隔符的区别逗号运算符是运算符(expr1, expr2)返回expr2的值。逗号分隔符是语法结构分隔参数、声明等元素无返回值。示例123inta 1, b 2, c 3;// 逗号作为声明语法分隔符intx (a 1, b 2, a b);// 逗号运算符x最终是3五、逗号运算符的求值顺序逗号运算符保证左边表达式先完整求值并完成所有副作用再求右边表达式。这比用;语句分割更严格。比如这段假设无优化12inti 1;intc (i, i 10);// i先执行 i变为2c 2 10 12六、逗号运算符的类型和值逗号运算符的类型和数值均由右侧表达式决定。示例12intx (1, 2);// x 2类型是 intfloaty (printf(Hi\n), 3.14f);// y 3.14f类型是 float七、逗号运算符的典型用例1. 将多条表达式写成一个表达式123inta 5, b 10;intc (a * 2, b 3, a b);// 先 a 10b 13 然后 c 232. for 循环多个变量迭代123for(inti 0, j 10; i 5; i, j--) {printf(i%d, j%d\n, i, j);}八、使用逗号运算符的注意事项优先级低要用括号明确范围避免歧义。不要滥用逗号运算符代码可读性容易下降。效果等同于用多条语句但逗号运算符保留在单个表达式中——这时非常有用比如在宏里。在逗号表达式中应避免修改同一对象的不同副作用造成未定义行为。九、经典逗号运算符误区示例12345intx 1;inty 2;intz x, y;// 不是逗号运算符是声明两个变量z 和 yy未初始化intw (x, y);// 逗号运算符这里 w y 2十、你不知道的细节逗号运算符可链式使用12intval (printf(Step 1\n),printf(Step 2\n), 100);// 先打印两条消息最后 val 100逗号运算符结合性是左结合所以上面等价于1intval ((printf(Step 1\n),printf(Step 2\n)), 100);总结方面说明定义顺序求值多个表达式返回最后一项的值和类型语法expr1 , expr2优先级优先级最低左结合关键特性确保按顺序求值副作用与逗号分隔符区别逗号运算符是表达式逗号分隔符是语法声明、函数参数等应用场景for循环多变量宏定义中的多步表达式紧凑表达式等使用注意易降低代码可读性需加括号避免产生未定义行为额外趣味逗号运算符的“隐藏套路”一些大师级宏会用逗号运算符巧妙生成表达式链巧妙且凌厉123456#define LOG_AND_RETURN(x) (printf(Return value: %d\n, (x)), (x))// 调用可以一边打印一边返回值intfoo() {returnLOG_AND_RETURN(42);}到此这篇关于C语言逗号运算符的具体使用的文章就介绍到这了
C语言逗号运算符的具体使用
逗号,在 C 语言里既可以作为逗号运算符也可以作为分隔符比如函数参数分隔、变量声明分隔。本文重点讲的是逗号运算符。一、逗号运算符是什么逗号运算符Comma Operator是 C 语言中的一个二元运算符其作用是依次计算逗号左边的表达式然后计算右边的表达式整个逗号表达式的值和类型为右边表达式的值和类型。即1(e1, e2)先计算e1丢弃其结果再计算e2整个表达式的值为e2的值。二、逗号运算符的语法和优先级语法1expression1 , expression2优先级逗号运算符的优先级是所有运算符中最低的仅比赋值表达式 () 和条件表达式 (?:) 优先级低。优先级表里逗号运算符是最末的且结合性是左结合。所以小括号很重要通常需要用括号明确表达式边界。三、逗号运算符的应用场景在循环中执行多条表达式123for(inti 0, j 0; i 10; i, j 2) {printf(i%d, j%d\n, i, j);}这里i, j 2中的逗号是逗号运算符使得两条表达式得以连续执行。在 return 语句或赋值中执行多步命令12intx;x (printf(Hello ), 42);打印“Hello ”再赋值42给x。宏定义中的多步操作1#define SWAP(a, b) do { int tmp a; a b; b tmp; } while(0)虽然用多条语句但如果一定要用逗号运算符可以写成1#define SWAP(a, b) ((a) ! (b) ((a) ^ (b), (b) ^ (a), (a) ^ (b)))利用逗号运算符依次执行三条异或交换表达式。四、逗号运算符与逗号分隔符的区别逗号运算符是运算符(expr1, expr2)返回expr2的值。逗号分隔符是语法结构分隔参数、声明等元素无返回值。示例123inta 1, b 2, c 3;// 逗号作为声明语法分隔符intx (a 1, b 2, a b);// 逗号运算符x最终是3五、逗号运算符的求值顺序逗号运算符保证左边表达式先完整求值并完成所有副作用再求右边表达式。这比用;语句分割更严格。比如这段假设无优化12inti 1;intc (i, i 10);// i先执行 i变为2c 2 10 12六、逗号运算符的类型和值逗号运算符的类型和数值均由右侧表达式决定。示例12intx (1, 2);// x 2类型是 intfloaty (printf(Hi\n), 3.14f);// y 3.14f类型是 float七、逗号运算符的典型用例1. 将多条表达式写成一个表达式123inta 5, b 10;intc (a * 2, b 3, a b);// 先 a 10b 13 然后 c 232. for 循环多个变量迭代123for(inti 0, j 10; i 5; i, j--) {printf(i%d, j%d\n, i, j);}八、使用逗号运算符的注意事项优先级低要用括号明确范围避免歧义。不要滥用逗号运算符代码可读性容易下降。效果等同于用多条语句但逗号运算符保留在单个表达式中——这时非常有用比如在宏里。在逗号表达式中应避免修改同一对象的不同副作用造成未定义行为。九、经典逗号运算符误区示例12345intx 1;inty 2;intz x, y;// 不是逗号运算符是声明两个变量z 和 yy未初始化intw (x, y);// 逗号运算符这里 w y 2十、你不知道的细节逗号运算符可链式使用12intval (printf(Step 1\n),printf(Step 2\n), 100);// 先打印两条消息最后 val 100逗号运算符结合性是左结合所以上面等价于1intval ((printf(Step 1\n),printf(Step 2\n)), 100);总结方面说明定义顺序求值多个表达式返回最后一项的值和类型语法expr1 , expr2优先级优先级最低左结合关键特性确保按顺序求值副作用与逗号分隔符区别逗号运算符是表达式逗号分隔符是语法声明、函数参数等应用场景for循环多变量宏定义中的多步表达式紧凑表达式等使用注意易降低代码可读性需加括号避免产生未定义行为额外趣味逗号运算符的“隐藏套路”一些大师级宏会用逗号运算符巧妙生成表达式链巧妙且凌厉123456#define LOG_AND_RETURN(x) (printf(Return value: %d\n, (x)), (x))// 调用可以一边打印一边返回值intfoo() {returnLOG_AND_RETURN(42);}到此这篇关于C语言逗号运算符的具体使用的文章就介绍到这了