-1

嗨,只是想知道您是否在 if 条件中使用链式分配,最左边的变量是否用于检查 if 条件

像 a=b=c 一样,它的 a 是最终检查的,而不是 b 或 c

#include <stdio.h>

 int main()
 {
  int a, b, c =0;
 
  // does this reduce to a == 100 and the variables b or c are not checked if they are == to 100 but simply assigned the value of 100 ? 
  if( (a = b = c = 100) == 100)
     printf( "a is 100 \n");

   
 return 0;
}
4

2 回答 2

4

该表达式实际上并未检查aorbc

赋值表达式,与任何表达式一样,都有一个值。在这种情况下,它是存储的值。但是,将值实际存储在对象中是一种副作用,因此不能保证它在评估比较运算符时已经发生。

所以条件实际上更像是:

if (100 == 100)

分配给a,b和以相对于比较而言无序c的方式发生。

这在C 标准关于赋值运算符的第 6.5.16p3 节中有详细说明:

赋值运算符将值存储在左操作数指定的对象中。赋值表达式在赋值后具有左操作数的值,但不是左值。赋值表达式的类型是左操作数在左值转换后的类型。更新左操作数的存储值的副作用是在左操作数和右操作数的值计算之后排序的。操作数的评估是无序的。

于 2021-01-31T18:44:44.570 回答
2

条件始终为真。您的代码相当于:

a = 100;
b = 100;
c = 100;
printf( "a is 100 \n");
于 2021-01-31T18:37:32.860 回答