我可以直接使用条件在C中分配变量

时间:2015-08-17 08:06:18

标签: c conditional-statements ternary-operator

bool bVal;
int a = 5;
int b = 2;

bVal = (bool)a>b;

声明bVal =a>b;是否可以接受。当然,这对我来说很好。

但我看到人们使用这样的东西:

#define CHECK_bIsTrue(value)  ((value) ? TRUE : FALSE)

为什么我们使用三元运算符,如果它只是布尔值?

4 个答案:

答案 0 :(得分:2)

是的,bVal = a>b;完全正确。

使用三元组进行这样一个简单的分配是过度的,并且使用宏是没有道理的。

答案 1 :(得分:0)

语句a > b保证产生非零或零,这对C运算符来说已足够ifwhile等等。但有时人们无论出于何种原因都希望获得肯定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>isdigitisalphastrcmp等函数的描述,可以在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语言。此外,使用预定义的宏truefalse,而不是非标准的TRUEFALSE