C 在类似的情况下,不使用返回值有时会返回true和false

C 在类似的情况下,不使用返回值有时会返回true和false,c,function,return,boolean,c89,C,Function,Return,Boolean,C89,根据C89标准,以下代码是合法的: A_Function_that_returns_true(); 但以下是错误的 (由于未使用返回值,因此只需声明bool变量即可解决此问题) 但是这两个例子之间有什么区别呢?在这两种情况下,我都没有使用返回值,所以为什么一个为真,一个为假听起来不正确丢弃表达式的结果并不违反C标准。问题中的两个表达式语句都没有违反任何规则或约束 编译器是否选择发出关于各种事情的有用警告是实现质量的问题,不受标准的约束 调用一个函数但不使用其返回值通常不是问题,因为许多(当然不

根据C89标准,以下代码是合法的:

A_Function_that_returns_true();
但以下是错误的 (由于未使用返回值,因此只需声明bool变量即可解决此问题)


但是这两个例子之间有什么区别呢?在这两种情况下,我都没有使用返回值,所以为什么一个为真,一个为假听起来不正确

丢弃表达式的结果并不违反C标准。问题中的两个表达式语句都没有违反任何规则或约束

编译器是否选择发出关于各种事情的有用警告是实现质量的问题,不受标准的约束

调用一个函数但不使用其返回值通常不是问题,因为许多(当然不是全部)函数做的不仅仅是计算并返回一个值。(正式术语是许多功能都有副作用。)

表情

(5>3) && (7>6);
另一方面,它完全没有用。很明显,它不会做任何事情(它没有副作用),因此建议编译器对此发出警告


如果编译器编写器决定也对忽略的函数返回值发出有益的警告,那么会出现一个直接的问题:几乎每个C程序都包含对
printf
的多个调用,而返回值不会被检查。因此,将有太多的误报,警告将是无用的。

丢弃表达式的结果并不违反C标准。问题中的两个表达式语句都没有违反任何规则或约束

编译器是否选择发出关于各种事情的有用警告是实现质量的问题,不受标准的约束

调用一个函数但不使用其返回值通常不是问题,因为许多(当然不是全部)函数做的不仅仅是计算并返回一个值。(正式术语是许多功能都有副作用。)

表情

(5>3) && (7>6);
另一方面,它完全没有用。很明显,它不会做任何事情(它没有副作用),因此建议编译器对此发出警告


如果编译器编写器决定也对忽略的函数返回值发出有益的警告,那么会出现一个直接的问题:几乎每个C程序都包含对
printf
的多个调用,而返回值不会被检查。因此,会有太多的误报,警告将是无用的。

我不认为第二行在语法上是不正确的,它是一个有效的陈述,没有任何效果。第二个例子肯定没有效果;第一种情况,即使您不使用函数的返回值,也可能会产生影响,但我们不知道(编译器也不知道)函数的内部是什么。这两个代码段都是“合法的”<代码>为什么一个为真一个为假-您是在指定表达式的返回值,还是。。。你如何衡量一个例子是“假”还是“真”,这是什么意思?是
1==1&&2==2的状态为“false”或“true”?@KamilCuk
1==1&&2==2
的计算结果为
true
,我看不出这是如何争论的。在示例2中,您到底在说什么“返回值”?没有可以返回任何内容的函数调用。这只是一个要计算的表达式。它的计算值是
true
我不认为第二行在语法上不正确,它是一个有效的语句,没有任何效果;第一种情况,即使您不使用函数的返回值,也可能会产生影响,但我们不知道(编译器也不知道)函数的内部是什么。这两个代码段都是“合法的”<代码>为什么一个为真一个为假
-您是在指定表达式的返回值,还是。。。你如何衡量一个例子是“假”还是“真”,这是什么意思?是
1==1&&2==2的状态为“false”或“true”?@KamilCuk
1==1&&2==2
的计算结果为
true
,我看不出这是如何争论的。在示例2中,您到底在说什么“返回值”?没有可以返回任何内容的函数调用。这只是一个要计算的表达式。它的计算值为
true
为避免编译器警告,将表达式强制转换为
void
(void)((5>3)和&(7>6))这在普通代码中没有意义,但在宏定义中可能有用。为了避免编译器警告,请将表达式强制转换为
void
(void)((5>3)和&(7>6))这在普通代码中没有意义,但在宏定义中可能有用。