查看: 165|回复: 3

C、Python与MATLAB续行符对比:反斜杠、括号与三个点

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
为什么要把一行代码拆成多行

写脚本时经常会遇到两种情况:一是单条语句本身很长(比如绘图参数、函数签名、SQL 语句),二是为了让参数一行一个、方便对照和注释。这时候就需要"续行"机制,让解释器或编译器把物理上的多行当成逻辑上的一行来处理。C、Python、MATLAB 三个语言体系给出的方案并不相同:C 用反斜杠和字符串字面量拼接,Python 用反斜杠、圆括号和三引号,MATLAB 用三个点号。本文按语言逐个拆解这些写法的实际代码与生效原因。

一、C 语言:反斜杠把两行拼成一行

C 语言中反斜杠 \ 放在行末,可以把上下两行视为同一行源代码。原文示例:
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     printf("Hello,\
  5. World! \n");
  6.     return 0;
  7. }
  8. // 输出:Hello, World!
复制代码

注意这里的 \ 是写在字符串字面量内部的,换行被吃掉后,字符串内容仍然是连续的 "Hello,World! " 加上换行符。也就是说,反斜杠续行作用在"源代码行"层面,发生在字符串解析之前。

C 语言还有第二种更常用于长字符串的手段:相邻字符串字面量的自动拼接。两个字符串之间只隔空白字符(空格、换行、制表符)时,编译器会把它们当成一个字符串处理。
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     printf("Hello,"
  5.            "World! \n");
  6.     printf("Hello," "World! \n");
  7.     return 0;
  8. }
  9. // 两行输出均为:Hello,World!
复制代码

从这里可以推导出两种写法的差别:反斜杠续行是把两行"硬拼"成一行,拼接发生在词法分析阶段之前;相邻字符串拼接是语法层面的规则,两段字符串各自独立成 token,再被合并。后者在需要把长 SQL、长提示语按行排版时更安全,因为反斜杠续行一旦行末夹杂空格或其他字符就会破坏续行关系。

二、Python:三种续行路径

1. 字符串字面量拼接

和 C 一样,Python 中两个字符串之间只隔空白字符时会被合并成一个字符串:
  1. #!/usr/bin/python3
  2. print("Hello,"
  3.       "World!")
  4. print("Hello," "World!")
  5. # 输出:
  6. # Hello,World!
  7. # Hello,World!
复制代码

2. 反斜杠续行

反斜杠 \ 的作用与 C 一致,把 \ 前后的两句当作一条语句:
  1. print(6+3\
  2.       +9)
  3. # 输出:18
复制代码

这种写法适合拆分超长的算术表达式。但由于 \ 必须紧贴行末,编辑器里肉眼不可见的行尾空格、缩进混排都会让它失效,因此在实际工程中更推荐下一种写法。

3. 圆括号续行(推荐)

圆括号可以容纳多行的表达式,也可以承载函数的多行入参,括号内的内容会被解析成一行。作为函数调用参数时:
  1. a = 1
  2. b = 2
  3. c = 3
  4. print(
  5.     a,
  6.     b,
  7.     c
  8. )
  9. # print 收到三个参数,依次打印 1、2、3
复制代码

这种写法在深度学习框架里几乎是标配,例如 TensorFlow 的归约函数签名本身就按参数逐行列出:
  1. tf.math.reduce_max(
  2.     input_tensor,
  3.     axis=None,
  4.     keepdims=None,
  5.     name=None,
  6.     reduction_indices=None,
  7.     keep_dims=None
  8. )
复制代码

括号续行的关键优势是不依赖反斜杠,行尾是否有多余空格都不影响解析;同时每个参数独占一行,便于逐条注释和 diff 对比。

4. 三引号:跨行字符串

单引号与双引号都用于表示字符串:单引号字符串可以直接包含双引号而无需转义,但内部出现单引号需写成 \';双引号字符串反之,内部出现双引号需写成 \"。

三双引号则同时承担两种角色——既可以当注释用,也可以表示允许跨多行的字符串,字符串内可直接包含换行符、制表符等特殊字符:
  1. #!/usr/bin/python3
  2. para_str = """这是一个多行字符串的实例
  3. 多行字符串可以使用制表符
  4. TAB ( \t )。
  5. 也可以使用换行符 [ \n ]。
  6. """
  7. print(para_str)
复制代码

原文指出其价值在于让程序员摆脱引号与转义的纠缠,保持一小块字符串的 WYSIWYG(所见即所得)格式。典型用例是需要内嵌一大段 HTML 或 SQL 时,用普通字符串拼接加转义会非常繁琐:
  1. errHTML = '''
  2. <HTML><HEAD><TITLE>
  3. Friends CGI Demo</TITLE></HEAD>
  4. <BODY><H3>ERROR</H3>
  5. <B>%s</B><P>
  6. <FORM><INPUT TYPE=button VALUE=Back
  7. ONCLICK="window.history.back()"></FORM>
  8. </BODY></HTML>
  9. '''
  10. cursor.execute('''
  11. CREATE TABLE users (
  12.     login VARCHAR(8),
  13.     uid INTEGER,
  14.     prid INTEGER)
  15. ''')
复制代码

三单引号与三双引号地位相同,可以互换使用。实践上的取舍规则是:内容里出现大量双引号时用三单引号包裹,反之用三双引号,这样可以少写转义。

三、MATLAB:三个点号续行

MATLAB 指定的续行符号是三个点 ...,作用类似 C 语言中的 \。它常用于把绘图样式参数、函数入参拆成多行:
  1. x1 = 0:1;
  2. y1 = 1 - x1;
  3. figure();
  4. plot(x1, y1, '--gs', 'LineWidth', 2, ...
  5.      'MarkerEdgeColor', 'b', ...
  6.      'MarkerFaceColor', 'r', ...
  7.      'MarkerSize', 10)
  8. hold on;
复制代码

这段代码里 plot 一共收到若干组"属性名—属性值"配对,每一组单独占一行,靠 ... 把四条物理行连成一条调用语句。如果不写 ...,MATLAB 会在第一行结束处认为语句已终止,后面的 'MarkerEdgeColor' 等参数就变成孤立表达式,绘图结果和预期不符。

四、三种语言的对照与选型

从原文示例可归纳出如下对应关系:

- C:行末 \ 硬续行;相邻字符串字面量自动拼接(空白字符被忽略)。
- Python:行末 \ 硬续行;圆括号容纳多行表达式与多行入参;三引号表示跨行字符串,兼作注释。
- MATLAB:行末 ... 续行,主要用于长参数列表。

使用建议可以按这个顺序取舍:能用括号的地方优先用括号(Python),能用相邻字面量拼接的地方优先用拼接(C 的长字符串、Python 的长字符串),只有在表达式内部无法加括号、或语言本身只提供续行符时才使用 \ 或 ...。原因是括号和字面量拼接属于语法结构,解析稳定;续行符属于行级约定,对行尾空白和编辑器设置敏感。

五、排查思路

当多行代码报语法错误时,先确认三件事:一是续行符是否真的位于行末,其后没有混入空格或不可见字符;二是当前语言是否支持这种续行方式(MATLAB 认 ...,不认 \;Python 两者都认,但对 \ 后紧跟内容敏感);三是多行字符串是否用对了引号数量,单引号、双引号不能跨行,跨行必须用三引号。把长语句改成括号包裹或相邻字面量拼接,通常能立刻绕开这类问题。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: C、Python与MATLAB续行符对比:反斜杠、括号与三个点

这篇对比挺清楚,按 C、Python、MATLAB 三条线把续行机制讲明白了。C 那里把反斜杠“词法分析前硬拼”和相邻字符串“语法层拼接”区分开,很实用;Python 圆括号续行确实更适合工程里逐行参数和 diff,三引号内嵌 HTML/SQL 的例子也直观;MATLAB 用三个点号把属性名和属性值分行排开,读起来舒服。一个小提醒:三引号里的换行和缩进会原样进入字符串,拼 SQL 时要注意格式;反斜杠续行则要特别小心行末空格。最后 MATLAB 不写三个点的部分好像没贴完,方便的话可以补全,想看看具体会报什么错。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: C、Python与MATLAB续行符对比:反斜杠、括号与三个点

这篇对比整理得挺清楚,尤其把 C 里“源代码行层面”的硬拼接和“相邻字符串字面量”的语法拼接区分开,很容易理解。C 的反斜杠续行确实容易受行尾空格、制表符之类影响,长字符串我更倾向用相邻字面量拼接;Python 的圆括号续行也很实用,参数一行一个方便注释和对比差异,三引号处理内嵌 SQL、HTML 这类内容很省转义;MATLAB 用三个点号把 plot 的属性名值对拆开,可读性也明显更好。整体很适合当速查和横向对比来看。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: C、Python与MATLAB续行符对比:反斜杠、括号与三个点

这篇对比整理得很清楚,尤其把反斜杠续行和相邻字符串拼接所处的解析层次差异讲明白了,对实际写脚本时选哪种写法很有帮助。Python 部分把圆括号续行作为推荐写法的理由也说得很实在,行尾空格和逐参数注释、diff 对比这些点都很贴近日常使用。MATLAB 用三个点拆 plot 参数示例也很直观。不过最后 MATLAB 部分好像截断在“如果不写 ...,MATL”,不写续行符的后果没展开,若方便的话可以补完,这样三种语言的对比就更完整了。整体内容很有参考价值。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-11-14 05:52 , Processed in 0.021515 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部