【问题标题】:Why syntax error occurs when a void function is checked in IF statement为什么在 IF 语句中检查 void 函数时会出现语法错误
【发布时间】:2010-07-15 11:30:41
【问题描述】:

如果我写了会是什么输出

在 C++ 中,if(5) 将毫无问题地执行,但在 C# 中则不能以同样的方式运行。

if(func()){} //in C# it doesn't runs Why how does C# treats void and how in Turbo C++

void func()
{
return;
}

if(null==null){}//runs in C#

编辑

if(printf("Hi"){} //will run and enter into if statement

if(printf(""){}//will enter into else condition if found.

此问题不适用于不了解 Turbo Compiler 的人

【问题讨论】:

  • 你是说if(void) 在 Turbo C++ 中工作?
  • 这也是 C++ 中的一个错误。问题不在于它是否运行,而在于它是否编译。 C++ 和 C# 都是编译语言,而不是解释语言。所以这个问题根本没有意义。 -1来自我。
  • @sbi:你的 -1 没问题,谢谢。我没有考虑 VS C++,我明确指定了 turbo 编译器。 @Henk:是的,我的意思是一样的,但仅限于 Turbo Compiler
  • @Shantanu:抱歉,我根本不相信任何版本的 TC 都允许你编译 if(func()) 如果 func() 返回 void。
  • @Shantanu:您可能想更改问题的文本:“当我使用损坏的 C++ 编译器时......”

标签: c# c++ casting void conceptual


【解决方案1】:

在 C# 中,if 语句中的条件类型必须可隐式转换为 bool。这减少了各种情况下的错误,基本上是一件好事。它可以防止这样的事情编译:

int x = ...;
if (x = 10) // Valid in C / C++, not in C#

即使在 C 和 C++ 中,如果您有合理的警告级别,一个体面的编译器也会在上述行中警告您。

如果void 版本在 C++ 中工作,我很惊讶...

【讨论】:

  • if 语句中的条件类型也必须在 C++ 中隐式转换为 bool。
  • if (x = 10) 将在最新的编译器上生成警告。
  • @Jon,@Christian: void 在 turbo 编译器中工作。在我上学时研究涡轮编译器之后,我认为它似乎是一种松散类型的语言
  • @Shantanu:不,它不是一种松散类型的语言。它是一个损坏的 C++ 编译器。它不是一门单独的语言(C++ 就是 C++,与编译器无关),它只是一个错误的、过时的编译器,任何人都不应该使用。
  • @sbi: 那么仅仅是 any 类型可以隐式转换为 bool 吗?或者只是很多(指针类型、整数等)?
【解决方案2】:

与 C/C++ 不同,C# 条件只能应用于布尔值。
请注意,void 函数没有返回值,因此不能对其应用任何条件。

【讨论】:

  • if(true) 无效,if(someString == Strings.Empty) 有效,因为您使用比较运算符来验证某些上下文。 +1
【解决方案3】:

void 函数根本不返回任何内容,因此无法使用 if 语句检查其返回值。

即使 C++ 也不会让你这样做。

【讨论】:

    【解决方案4】:

    在 C/C++ 中,非零整数值与逻辑真值相同。原因是 C/C++ 没有定义布尔类型,所以整数被用作布尔变量。 后来人们发现这种隐式类型转换在编译器试图找到合适的函数重载版本时会导致意外的行为,因此在C#中没有重复该错误。

    要在 C# 中获得相同的行为,请编写 if (x!=0) { ... }

    【讨论】:

      【解决方案5】:

      在 C 和 C++ 中,int、指针和大多数其他类型都隐式转换为 bool。

      为了清楚起见,C# 的设计者选择不拥有它。

      所以

      int i = 1;
      int* P = null;
      
      if (i && p) { } // OK in C++
      
      if (i != 0 && p != null) { }  // OK in C++ and C#
      

      【讨论】:

      • 这甚至是我在使用 C、C++ 时所经历的。 Turbo 编译器也是如此。对于其他我不知道的编译器。
      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      相关资源
      最近更新 更多