bool bVal;
int a = 5;
int b = 2;
bVal = (bool)a>b;
声明bVal =a>b;
是否可以接受。当然,这对我来说很好。
但我看到人们使用这样的东西:
#define CHECK_bIsTrue(value) ((value) ? TRUE : FALSE)
为什么我们使用三元运算符,如果它只是布尔值?
答案 0 :(得分:2)
是的,bVal = a>b;
完全正确。
使用三元组进行这样一个简单的分配是过度的,并且使用宏是没有道理的。
答案 1 :(得分:0)
语句a > b
保证产生非零或零,这对C运算符来说已足够if
,while
等等。但有时人们无论出于何种原因都希望获得肯定1
(或TRUE
)或0
(或FALSE
)这就是他们使用宏的原因。
答案 2 :(得分:0)
有时你需要一个或者0表示一些表达式。
考虑一个例子。
让我们假设您决定编写一些应用于整数数组的通用函数,这些函数将根据给定条件计算某些内容。
该功能可以按以下方式查看
int count( int a[], size_t n, int predicate( int x ) )
{
int cnt = 0;
for ( size_t i = 0; i < n; i++ ) cnt += predicate( a[i] );
return cnt;
}
如您所见,该函数的实现方式只是将谓词的结果添加到变量cnt
。
cnt += predicate( a[i] );
然而,谓词不必返回1或0。
例如,一些可以像谓词一样使用的标准C函数通常会返回一些非零值来指定条件为真。例如,根据<ctype.h>
中isdigit
,isalpha
等strcmp
等函数的描述,可以在C标准中编写(7.4.1字符分类函数)
1如果和,则子条款中的函数返回非零(true) 只有当参数c的值符合的时候 功能描述。例如,让我们假设
C标准中有许多这样的函数(例如考虑另外一个函数count
)。
因此返回函数int is_2nd_bit_set( int x ) { return x & 2; }
的示例,如果它将被写入,则执行结果可能不正确
例如,让我们假设如果已设置数字的第二位,则已存在返回非零值的函数
#include <stdio.h>
int count( int a[], size_t n, int predicate( int x ) )
{
int cnt = 0;
for ( size_t i = 0; i < n; i++ ) cnt += predicate( a[i] );
return cnt;
}
int is_2nd_bit_set( int x ) { return x & 2; }
int main( void )
{
int a[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10 };
const size_t N = sizeof( a ) / sizeof( *a );
printf( "there are %d numbers that have 2nd bit set\n", count( a, N, is_2nd_bit_set ) );
}
在这种情况下,如果您运行此程序
there are 10 numbers that have 2nd bit set
你得错了结果
for ( size_t i = 0; i < n; i++ ) cnt += ( predicate( a[i] ) ? 1 : 0 );
要获得正确的结果,您必须按以下方式重写函数中的相应语句
for ( size_t i = 0; i < n; i++ ) cnt += !!predicate( a[i] );
有些程序员使用了否定运算符!对表达式应用两次以获得正好1或0.例如
_Bool
但是这样的代码会让读者感到困惑。
现在,当在C标准中引入类型for ( size_t i = 0; i < n; i++ ) cnt += ( _Bool )predicate( a[i] );
时,可以更简单地编写语句
buildscript {
repositories {
maven {
url 'http://avra_artifactory:8081/artifactory/plugins-release'
credentials {
username = "${artifactory_user}"
password = "${artifactory_password}"
}
}
}
dependencies {
classpath(group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '2.0.9')
}
}
allprojects {
apply plugin: 'artifactory'
}
artifactory {
contextUrl = "${artifactory_contextUrl}" //The base Artifactory URL if not overridden by the publisher/resolver
publish {
repository {
repoKey = 'libs-release-local'
username = "${artifactory_user}"
password = "${artifactory_password}"
maven = true
}
}
resolve {
repository {
repoKey = 'libs-release'
username = "${artifactory_user}"
password = "${artifactory_password}"
maven = true
}
}
}
答案 3 :(得分:0)
由于历史原因,产生布尔结果的所有C操作数(例如>
运算符)实际上返回值为{0}的类型int
。这使得C奇数,因为即使有现在语言中的布尔类型,所有逻辑和布尔操作仍然适用于int
类型。
(bool)a>b
是错误的,因为它没有意义:它在操作之前将a
操作数转换为bool
。但是操作本身将两个操作数都提升为int
,因此演员唯一能够实现的是(不太可能和不相关)的价值损失。
如果你对类型正确性过于挑剔,可以使用bVal = (bool)(a>b);
显式地将结果类型强制转换为bool,这与bVal = a>b;
完全相同。要么没事。
你发布的宏不仅没有意义,这是不好的做法。不应该尝试使用类似函数的宏来发明个人版本的C语言。此外,使用预定义的宏true
和false
,而不是非标准的TRUE
和FALSE
。