C编程 - while循环中的逗号运算符

时间:2017-01-12 11:05:34

标签: c while-loop programming-languages comma

Prog 1:

#include<stdio.h>
 int main()
 {
     int i=0;
     while(i<=8,i++);
     printf("%d",i);
     return 0;
  }

Prog 2:

#include<stdio.h>
 int main()
{
  int i=0;
  while(i++,i<=8);
  printf("%d",i);
  return 0;
}

Prog 1的输出为1,Prog 2的输出为9.

有人可以解释这里的情况吗?这两个代码有何不同?

3 个答案:

答案 0 :(得分:4)

逗号运算符依次计算它的两个参数,丢弃结果,除了最后一个。最后一个求值表达式确定整个表达式的结果。

i++ - 此处表达式的值是i的值,这是i++,i<=8在递增之前的值。它为0所以循环立即终止。

i<=8 - 此处表达式的值是i的值,仅当cat ./bbc1.csv | cut -f3 -d' ' | grep -v ^[a-z] 递增到9时才为0。

在个人注意事项上:我认为第二种形式虽然与for循环有些相似,但对于代码的读者而言,并不比实际的for循环更清晰。

答案 1 :(得分:1)

while ( condition )
    statement

重复执行语句。在评估每个执行(迭代)条件之前。如果它是假的,则循环结束并且执行继续超出它。

在这种情况下,语句为空。 Statement可以是以分号(;)结尾的单行代码,也可以是用大括号括起来的块代码({,})

因此,我们会连续评估条件,直到它产生错误。要了解发生了什么,我们需要检查逗号运算符的工作方式。

(注意,虽然逗号作为一个字符可以在C中使用 - 我可以想到函数声明,定义和调用 - 在这种情况下,逗号字符是条件的一部分,因此它充当运算符。)

expression1 , expression2

逗号运算符导致首先计算表达式1,然后计算表达式2,并返回表达式2的值。

每次评估条件时,我们将评估两个操作数(i ++,i&lt; = 8),并在右操作数解析为真时继续。

虽然通常我们使用条件来控制循环的执行,但在这种情况下,条件可能会产生其他影响。在我们的情况下,变量i受到每个条件评估的影响。它增加了一个。

我们的例子只是条件操作数的顺序不同,因此操作数结果实际上控制了循环的执行。

让我们先来看看第二个例子。在这种情况下,我们有条件&#34; i ++,i&lt; = 8&#34;。这意味着在每次评估时我们首先增加i,然后检查它是否小于或等于8.因此,在第一次评估条件时,我们将i从0增加到1并得出1 <= 8,因此循环继续。如此构造的循环只能在i变为9时断开,即。在第9次迭代。

现在,对于第一个例子,条件是&#34; i&lt; = 8,++ i&#34;。由于比较没有任何副作用,即我们可以按任何顺序执行任何数量的比较,如果这是我们做的唯一事情,那就是如果我们没有以某种方式执行任何其他操作或依赖于结果的顺序比较中,这些比较绝对没有任何意义。在我们的例子中,我们评估i&lt; = 8,其评估为真或假,但我们不使用该值,只是继续评估正确的操作数。所以我们的条件实际上等于&#34; i ++&#34;。

这是一个增量后的一元运算符。它返回i的值,然后才增加1。 (保证所有这一切都是这个顺序。当我确实增加时实际上是一个复杂的,并不总是在标准事项中确定,除非我错了)。那么我们首先要检查我是真还是假,然后,无论如何,我们将它增加1,然后才打破循环或继续。

在C中没有true或false值,没有布尔类型。如果整数具有非零值,则认为它们是真的。

首先评估&#34; i ++&#34;我们得到0,这是假的。这意味着循环中断甚至没有一次迭代。然而评估&#34; i ++&#34;不过会导致它增加一个,所以当我们用while循环完成时,我已经是1。

答案 2 :(得分:0)

表达式分隔符运算符,强制从左到右进行求值,也是排序点

Prog 1:考虑i <= 8, i++。评估并丢弃i <= 8,然后评估i++。整个表达式的未增加值为i。由于i最初为0,因此while循环在第一次迭代时终止。输出将是i的单个递增值,即1。

程序2:i++被评估并且结果被丢弃,然后i <= 8使用i值进行评估,因为,while 排序点。因此,i <= 8循环会一直运行,直到true不再是i,并且增加的值为using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Drawing; using System.Windows.Forms; using System.IO; namespace Popeye_Booking_application { public partial class Form1 : Form { const string FILENAME = @"c:\temp\test.xml"; DataTable dt = new DataTable(); public Form1() { InitializeComponent(); if (File.Exists(FILENAME)) { dt.ReadXml(FILENAME); dataGridView1.DataSource = dt; } else { dt.TableName = "Data"; dt.Columns.Add("Data1",typeof(string)); dt.Columns.Add("Data2", typeof(string)); dt.Columns.Add("Data3", typeof(string)); dt.Columns.Add("Data4", typeof(string)); dt.Columns.Add("Data5", typeof(string)); dt.Columns.Add("Data6", typeof(string)); dt.Columns.Add("Data7", typeof(string)); SaveXml.SaveData(dt, FILENAME); } } private void buttonCreate_Click(object sender, EventArgs e) { try { Information info = new Information(); info.Data1 = textBoxData1.Text; info.Data2 = textBoxData2.Text; info.Data3 = textBoxData3.Text; info.Data4 = textBoxData4.Text; info.Data5 = textBoxData5.Text; info.Data6 = textBoxData6.Text; info.Data7 = textBoxData7.Text; dt.Rows.Add(new object[] { info.Data1, info.Data2, info.Data3, info.Data4, info.Data5, info.Data6, info.Data7 }); dt.AcceptChanges(); dataGridView1.DataSource = null; dataGridView1.DataSource = dt; SaveXml.SaveData(dt, FILENAME); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void label1_Click(object sender, EventArgs e) { } private void label4_Click(object sender, EventArgs e) { } private void label10_Click(object sender, EventArgs e) { } private void label7_Click(object sender, EventArgs e) { } private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { } } public class SaveXml { public static void SaveData(DataTable dt, string filename) { dt.WriteXml(filename, XmlWriteMode.WriteSchema); } } public class Information { private string data1; private string data2; private string data3; private string data4; private string data5; private string data6; private string data7; public string Data1 { get { return data1; } set { data1 = value; } } public string Data2 { get { return data2; } set { data2 = value; } } public string Data3 { get { return data3; } set { data3 = value; } } public string Data4 { get { return data4; } set { data4 = value; } } public string Data5 { get { return data5; } set { data5 = value; } } public string Data6 { get { return data6; } set { data6 = value; } } public string Data7 { get { return data7; } set { data7 = value; } } } } 。输出为9。