如何将 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 的值。

|| 是逻辑或运算符 - 如果 ab 不为零,则表达式 a || b 的计算结果为 1,如果 ab 均为零,则计算结果为 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. 您不必使用名称argcargv,尽管它们是通用约定。 3. 实现可能main 提供额外的签名(例如除了argcargv 之外的额外参数),但必须记录这些额外的签名;不要假设任何随机签名都是有效的。

【讨论】:

遗憾的是,您的为 C++ 编写它的更好方法 产生的结果与 C 版本不同。

以上是关于如何将 C 转换为 C++?的主要内容,如果未能解决你的问题,请参考以下文章

试图了解如何将 C++ 对转换为 C 代码

如何将 C++ 或 C 中的字符串转换为整数数组?

如何使用 C 或 C++ 将 .caf 文件转换为 .wav?

如何将 void* 转换为 foo* 以符合 C++?

如何将 C++ 转换为 C# 代码而 statmernt 代码递减

如何将string转换成wstring C++