让我在编程中被判断为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)
如果有人愿意让我联系这些技能,我会很高兴 谢谢和问候。
答案 0 :(得分:4)
更改z=-1
或x=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.