为什么这个基本C程序的输出?

时间:2015-08-21 07:59:53

标签: c

让我在编程中被判断为Noob,我一直在学习c / c ++中编程的混淆方式,因为c编译器会从右侧向左侧编译语句。

我有以下代码:

int main(){
    int x=5, y=20, z=1;
    int k = x > y < z;
    printf("%d", k);
    return 0;
}

返回的输出为1,这是否意味着 x > y < z = (x>y) < z

x > y < z = x > (y<z)

如果有人愿意让我联系这些技能,我会很高兴 谢谢和问候。

6 个答案:

答案 0 :(得分:4)

更改z=-1x=0并找出答案。同时将int main()更改为更正确的int main ( void )

更改z = -1将输出0,而k如果1 x > y == z则为z = 0。简而言之:

k = x > y < z;

与写作相同

k = (x > y) < z;

左到右。

答案 1 :(得分:2)

根据C语法(6.5.8关系运算符)

1 relational-expression:
    shift-expression
    relational-expression < shift-expression
    relational-expression > shift-expression
    relational-expression <= shift-expression
    relational-expression >= shift-expression
  

1关系运算符组从左到右(C ++标准:))

  

6每个运营商&lt; (小于),&gt; (大于),&lt; =(小于   或者等于),并且&gt; =(大于或等于)如果是,则产生1   指定的关系为true,如果为false,则为0 .107)结果为   输入int。

这个声明中的初始化器

int k =x>y<z;

相当于

int k = ( x > y ) < z;

当x小于y时,表达式x > y产生0,而z大于0,则完整表达式产生1。

以下运算符具有从右到左分组:

unary operators 
conditional operator  
assignmnet and compound assignment operators

答案 2 :(得分:1)

首先,您必须检查运算符优先级,这通过查看operator precedence table最简单。如果这样的表是体面的,它将列出运算符&gt;和&lt;在一个名为关系运算符的组中。该组中的所有运算符都具有相同的运算符优先级。

由于运营商&gt;和&lt;具有相同的优先级,操作数将被处理的顺序由该组运算符的相关性决定。对于关系运算符,这是从左到右。因此,保证表达式被处理为(x > y) < z

答案 3 :(得分:0)

在C中,布尔值是数值,所以:

false - &gt; 0 是的 - &gt; != 0,因此任何非0的数字都表示布尔值为真。

所以如果您的代码:

int k = x > y < z;

可以按以下方式拆分:

int k = (x > y) < z;

将是:

int k = ( 5 > 20) < 1;

第一部分的计算结果为false(即0),那么等式将以这种方式发生:

int k = 0 < 1;

这是真的,因此

int k = 1;

答案 4 :(得分:0)

k =(5> 20)&lt; 1 =假(0)

k =(0 <1)=真(1)

printf(%d,k)= 1

答案 5 :(得分:0)

也许你应该知道Operator precedence and associativity。您可以谷歌或查看书籍<<c++ primer>>。首先,运算符><具有相同的优先级。然后我们应该使用associativity,运营商只有left associativity。所以答案是x> y< z= (x>y)<z)。我希望这可以帮到你。 Remember: 1. precedence; 2. associativity.