如何将 C 转换为 C++?
Posted
技术标签:
【中文标题】如何将 C 转换为 C++?【英文标题】:How to convert C to C++? 【发布时间】:2015-12-15 12:20:25 【问题描述】:如何将 C 代码转换为 C++?当我尽力而为时,我每次都失败了。 谁能帮帮我?
特别是,我试图理解以下内容:
v=v%10?v%(5*r)*n--:v/10
我知道v == v mod 10,v%(5*r)*n--
。如果没有,v/10
。但我不明白v%(5*r)*n--
。
这是上下文中的代码:
long v=1,r=1e9;
main(n)
for(scanf("%d",&n);v=v%10?v%(5*r)*n--:v/10;n||printf("%d",v%r));
【问题讨论】:
C++ 是从 C 派生的,你可以在 C++ 上运行 C 代码,但反之则不行。 用 C 编写的源代码已经是 C++ 代码。只需将文件的扩展名更改为 .cpp 并非所有的 C 都是 C++!存在差异,但最直接的 C 代码可以直接编译为 C++。这个不太清楚,需要先搞清楚。首先不确定它是否是有效的C。 C 需要来自main
的显式 return
。
立即停止阅读该博客。
那段代码太可怕了。请不要再向写它的人学习。
【参考方案1】:
这个 C 表达式在 C++ 中也有效。由于运算符优先规则,表达式v%(5*r)*n--
等效于表达式v % ((5*r)*(n--))
。后缀递减运算符--
(它将变量减一)将首先计算,剩下的是A % B * C
类型的表达式。由于运算符%
(余数)和*
(乘法)具有相同的优先级,因此将应用从左到右的关联规则。因此,我们有v % ((5*r)*(n--))
。有关更多信息,请查看以下链接:
http://en.cppreference.com/w/cpp/language/operator_precedence
https://en.wikipedia.org/wiki/Operator_associativity
你也不懂三元运算符。在您的情况下,整个语句v=v%10?v%(5*r)*n--:v/10
意味着:如果v%10
为真(不同于零),则将v%(5*r)*n--
的结果分配给变量v
,否则将v/10
的结果分配给变量v
。欲了解更多信息,请查看
http://www.cprogramming.com/reference/operators/ternary-operator.html
顺便说一句,请注意写这篇博客的人写了一些糟糕的代码。你可能不想从中学习。
【讨论】:
如果你没有混淆左右,那么你的答案会很好,因此给等效表达式的括号错误。【参考方案2】:您对main
的定义很糟糕。 C++ 不允许函数1 的隐式类型,main
接受零个或两个参数;应该写成
int main( int argc, char **argv )
...
如果程序接受任何命令行参数2 和
int main( void )
...
如果没有3。
表达式 v=v%10?v%(5*r)*n--:v/10
在 C 和 C++ 中同样有效(如果丑陋得难以形容),所以这不是问题。
不过,n||printf("%d",v%r)
表达式有点让人头疼;你认为它试图完成什么?
编辑
抱歉,我写最后一段时还没有完全清醒。显然,该表达式的意图是只在n
为0 时写入v%r
的值。
||
是逻辑或运算符 - 如果 a
或 b
不为零,则表达式 a || b
的计算结果为 1,如果 a
和 b
均为零,则计算结果为 0。运算符短路;如果a
不为零,则无论b
的值如何,a || b
的结果都是1,因此根本不会评估b
。
因此,在表达式n || printf( "%d", v%r )
中,如果n
不为零,则不会执行printf
调用。
注意这一行
for(scanf("%d",&n);v=v%10?v%(5*r)*n--:v/10;n||printf("%d",v%r));
是可怕的;即使有一些空格,也很难跟踪和调试。这不应被视为良好代码的示例。这种编程风格只适合IOCCC,只是对于那个特定的比赛来说它并不丑足够。
为 C++ 编写它的更好方法是
#include <iostream>
int main( void )
long v=1,r=1e9; // no reason to make these global
int n;
if ( std::cin >> n )
while ( v ) // v != 0
if ( v % 10 )
v = v % (5 * r) * n--; // whitespace is your friend, use it
else
v = v / 10;
if ( n ) // n != 0
std::cout << v % r;
else
std::cerr << "Error while reading \"n\"...try again" << std::endl;
return 0;
1. 自 1999 年标准以来,C 也没有,无论如何这是不好的做法。 2. 您不必使用名称
argc
和argv
,尽管它们是通用约定。
3. 实现可能为main
提供额外的签名(例如除了argc
和argv
之外的额外参数),但必须记录这些额外的签名;不要假设任何随机签名都是有效的。
【讨论】:
遗憾的是,您的为 C++ 编写它的更好方法 产生的结果与 C 版本不同。以上是关于如何将 C 转换为 C++?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C 或 C++ 将 .caf 文件转换为 .wav?